Классика баз данных - статьи

       

Семантика счетчиков с параллельным обновлением


Объект-счетчик поддерживает целочисленный счетчик (положительный или отрицательный) на основе получаемых им сообщений по увеличению или уменьшению значения. При получении сообщения объект увеличивает или уменьшает значение счетчика на единицу (или на указанное число) и возвращает полученное значение счетчика. При применении традиционной семантики параллелизма параллельная модификация счетчика приводит к физическому конфликту. Однако, поскольку операции увеличения и уменьшения являются коммутативными, эти операции не конфликтуют на логическом уровне, когда выполняются в параллельных транзакциях.

Можно определить, по крайней мере, три вида счетчиков с разной CU-семантикой. Первый вид - это CuCounter со следующей семантикой параллелизма: транзакции, изменяющие значение счетчика, не конфликтуют с другими транзакциями, которые изменяют или читают значение счетчика. Следовательно, две транзакции могут увеличить счетчик объекта CuCounter и смочь успешно зафиксироваться, или же транзакция, читающая счетчик, может успешно зафиксироваться, несмотря на наличие других транзакций, изменяющих счетчик. Этот CuCounter ориентирован на поддержку таких приложений, как в описанном ранее примере складского приложения.

Второй вид счетчика - это CuPositiveCounter. При использовании этого счетчика параллельные транзакции могут изменять счетчик без конфликтов, пока в результате операций модификации значение счетчика не становится отрицательным. Если транзакция уменьшает счетчик объекта CuPositiveCounter такого, что значение его счетчика стало бы после этого отрицательным, как только стали бы видимыми зафиксированные изменения другой транзакции, то фиксация данной транзакции не разрешается. При работе с CuPositiveCounter читающие и пишущие транзакции не конфликтуют.

Третий вид счетчика, CuAccount, обеспечивает семантику, аналогичную семантике объекта Account, определенного в []. При использовании этого счетчика терпят неудачу все некоммутативные операции. Это означает, что транзакция, читающая значение счета, будет конфликтовать с другой транзакцией, увеличивающей или уменьшающей это значение. Как и при использовании CuPositiveCounter, параллельные операции увеличения и уменьшения преуспевают до тех пор, пока счетчик остается положительным. Этот тип счетчика подходит при моделировании финансовых счетов, когда транзакция, читающая значение счетчика, не имеет права на фиксацию, если параллельная транзакция зафиксировала измененное значение счетчика.



Содержание раздела