SQL: на уровне изоляции REPEATABLE READ удерживаются ли блокировки UPDATE до конца транзакции? - PullRequest
2 голосов
/ 23 августа 2011

I прочитал о том, как REPEATABLE READ заставляет блокировки, удерживаемые инструкциями SELECT, удерживаться до конца транзакции.То же самое верно для исключительных блокировок, принятых операторами UPDATE?Следовательно, это тот случай, когда я ОБНОВЛЯЮ строку в транзакции, последующие SELECT вернут значение, оставленное UPDATE?

Так что я понимаю, что если я ВЫБИРАЮ строку в транзакции 1, то транзакция 2 не сможетОБНОВЛЯЙТЕ, пока транзакция 1 не завершится.Тем не менее, если я ОБНОВЛЯЮ строку в транзакции 1, придется ли транзакции 2 ждать завершения транзакции 1, прежде чем транзакция 2 сможет ее обновить?

1 Ответ

4 голосов
/ 23 августа 2011

Если вторая транзакция не выполняется на уровне изоляции READ UNCOMMITED, эксклюзивные блокировки, принятые операторами UPDATE в первой транзакции, будут блокировать любые выборки, пока первая транзакция не завершится.

Так что я понимаю, что еслиЯ выбираю строку в транзакции 1, затем транзакция 2 не может обновить ее, пока транзакция 1 не завершится.Тем не менее, если я ОБНОВЛЯЮ строку в транзакции 1, будет ли транзакция 2 все еще ждать завершения транзакции 1, прежде чем транзакция 2 сможет ее ОБНОВИТЬ?

Да.

Если указано значение ПОВТОРЧИТАЙТЕ, вы выполняете SELECT в транзакции 1, транзакция 2 все еще может добавить новые данные, которые соответствуют предложению WHERE SELECT в транзакции 1. Это связано с тем, что транзакция 1 устанавливает блокировки чтения строк на все извлеченные данные, но незамки дальности.

...