Есть принципиальная разница в использовании lock-free подходов CAS в прикладном коде и MVCC в базах данных?

Пример использования CAS брал тут

do
{
  comparand = eventHandler;
  eventHandler = Interlocked.CompareExchange<EventHandler>(ref this.MyEvent, (EventHandler) Delegate.Combine((Delegate) comparand, (Delegate) value), comparand);
}
while (eventHandler != comparand);

MVCC описание использования взял тут (как я понял это именно эта технология):

Read committed

Сохранение нескольких версий параллельно изменяемых строк. При каждом изменении строки СУБД создаёт новую версию этой строки, с которой продолжает работать изменившая данные транзакция, в то время как любой другой «читающей» транзакции возвращается последняя зафиксированная версия. Преимущество такого подхода в том, что он обеспечивает бо́льшую скорость, так как предотвращает блокировки. Однако он требует, по сравнению с первым, существенно бо́льшего расхода оперативной памяти, которая тратится на хранение версий строк. Кроме того, при параллельном изменении данных несколькими транзакциями может создаться ситуация, когда несколько параллельных транзакций произведут несогласованные изменения одних и тех же данных (поскольку блокировки отсутствуют, ничто не помешает это сделать). Тогда та транзакция, которая зафиксируется первой, сохранит свои изменения в основной БД, а остальные параллельные транзакции окажется невозможно зафиксировать (так как это приведёт к потере обновления первой транзакции). Единственное, что может в такой ситуации СУБД — это откатить остальные транзакции и выдать сообщение об ошибке «Запись уже изменена».

Понятно что CAS именно для свапа, а MVCC вообще в контексте баз данных. Идея применения показалась похожей - если другой процесс/поток/транзакция успел раньше текущей выполнить действие, то действия текущей откатить и возможно начать попытку заново.

UPDATE

Пробую переформулировать. Места использования и задачи разные. MVCC более общий, а CAS вообще для 1 задачи.

Но в двух описаниях/примерах есть что-то что происходит, к примеру обмен данными или обновление записи в БД. В конце двух подходов идет проверка если кто-то другой менял данные, то операция не успешна.
Привильно я понимаю что это на самом деле один и тот же подход/концепция избежать блокировок? Или есть разные подходы lock-free, не только на основе версий? Может есть не только CAS для прикладного кода, а и какое-то обобщение как и MVCC для баз данных.


Ответы (0 шт):