ReadCommitted IsolationLevel - PullRequest
       1

ReadCommitted IsolationLevel

1 голос
/ 11 марта 2011

Устанавливает ли уровень изоляции ReadCommitted для каких-либо блоков выбранные данные? Сбой в следующем рабочем процессе:

transaction 1: read record with id 1
transaction 2: read record with id 1
transaction 1: update record with id 1 and commit
transaction 2: update record with id 1 and commit

Насколько мне известно, ReadCommitted должна это разрешить, не так ли?

Ответы [ 2 ]

2 голосов
/ 11 марта 2011

Ответ, вероятно, зависит от того, какую СУБД вы используете.В Oracle это не приведет к сбою, но обновление транзакции 2 будет заблокировано транзакцией 1, пока транзакция 1 не будет зафиксирована, после чего обновление транзакции 2 будет выполнено.

1 голос
/ 11 марта 2011

Да, это разрешено. Если вы не выполняете внешнюю синхронизацию клиентов, так что второй выдает COMMIT только после того, как первый получил положительное подтверждение того, что его фиксация выполнена успешно, порядок выполнения UPDATE не определен (базе данных нужно только притвориться, что они были сериализованы, но нет гарантии заказа), так что это помогает записать их так, чтобы они изменяли существующие данные, а не заменяли их, и / или цитировали результат SELECT в предложении WHERE, чтобы сделать UPDATE при условии, что строка не изменена. E.g.:

-> SELECT key,value FROM mytable WHERE key = 1;
1 row:
key|value
1  |foo

-> UPDATE mytable SET value='bar' WHERE key = 1 AND value = 'foo';
0 rows affected

Это показывает, что другой запрос изменил строку между ними.

...