2013-06-03 3 views
4

при использовании стратегии оптимистически-блокировки, это может решить проблему параллелизма, как показано ниже:Оптимистично-Блокировка абсолютно безопасна?

 
| the first transaction started  | 
|          | 
| select a row       | 
|          | the second transaction started 
| update the row with version checking | 
|          | select the same row 
| commit txn       | 
|          | update the row with version checking 
|          | 
|          | rolls back because version is dirty 

Но что, если в крайне редких случаях, если обновление во второй транзакции после udpate в первой транзакции, но перед тем, сделка совершена?

 
| the first transaction started  | 
|          | the second transaction started 
| select a row       | 
|          | select the same row 
| update the row with version checking | 
|          | update the row with version checking 
| commit txn       | 
|          | rolls back because version is dirty // will it? 
|          | 
|          | 

Я сделал эксперимент, что обновление во второй транзакции не мог читать «грязной» версии, потому что первая сделка не было совершено еще. Произойдет ли в этом случае вторая транзакция?

+0

@Adam Arold Спасибо, что рассказали мне этот афоризм. Я google, потому что я не являюсь носителем английского языка :) Но будет ли стратегия оптимистичного блокирования работать в случае, о котором я упоминал? – Hippoom

+0

Если это действительно оптимистично, почему вы используете функцию транзакции? Обновление само по себе не будет требовать откат. – tia

+0

@tia Возможно, в примере это нормально с транзакциями или без них. Но иногда мне нужно отменить другие изменения (например, возможно, некоторые вставки в подтаблицу) в базу данных – Hippoom

ответ

2

Вы не сказали в своем вопросе, какую систему баз данных вы используете, поэтому я не знаю деталей вашей системы.

Но в любом случае, при оптимистичной системе блокировки, процесс не может просто проверять версии строк при выполнении оператора обновления из-за именно той проблемы, о которой вы беспокоитесь.

Для полностью сериализуемых изолированных транзакций каждый процесс должен атомарно проверять версии строк всех строк, которые он исследовал и модифицировал, в момент фиксации. Таким образом, в вашем втором сценарии правый процесс не будет обнаруживать конфликт, пока он не попытается совершить (шаг, который вы не включили для правого процесса). Когда он пытается совершить, он обнаружит конфликт и откатится.

+0

Благодарим за ответ. Мы используем Oracle 10g в производственной среде, уровень изоляции считывается. – Hippoom

+0

Будет ли это действительно терпеть неудачу, когда он попытается зафиксировать. Я имею в виду, что это не будет генерировать исключение, когда проверка числа не удастся при использовании оптимистической блокировки, она просто обновляет 0 строк, а разработчик генерирует исключение, когда затронутая строка равна 0. – Hippoom

+0

Возможно, я смогу сделать еще один эксперимент, спящий поток после выполняется обновление sql, но до совершения транзакции и обновления той же строки в другом потоке, а затем разбудить первый поток вверх. – Hippoom