Следующие запросы

SELECT * FROM (SELECT * FROM Users) WHERE Id = 1

А также

SELECT * FROM Users Where Id = 1

Эквивалентны. Но, согласно документации, в режиме Serializable все выборки выполняются в LOCK IN SHARED MODE. Означает ли это, что в первом примере вся таблица Users будет заблокирована в общем режиме?

4
SiberianGuy 13 Мар 2011 в 09:51
1
Почему бы тебе не попробовать? Откройте два разных соединения, запустите две транзакции и проверьте результат.
 – 
Frank Heikens
13 Мар 2011 в 11:53
Как проверить записи с блокировкой чтения?
 – 
SiberianGuy
13 Мар 2011 в 14:04
Также укажите используемый механизм хранения
 – 
Andreas
13 Мар 2011 в 15:00
Это больше касается оптимизаторов запросов, чем блокировок. Достойный оптимизатор запросов должен переписать подзапрос в простой оператор.
 – 
Peter G.
13 Мар 2011 в 18:16

1 ответ

Я думаю, вы неправильно понимаете концепцию блокировки режима общего доступа. Из документации MySQL:

SELECT ... LOCK IN SHARE MODE устанавливает блокировку общего режима для прочитанных строк. Блокировка общего режима позволяет другим сеансам читать строки, но не изменять их.

Таким образом, могут быть параллельные чтения. Только изменения будут отложены до тех пор, пока ваш запрос не будет выполнен.

1
vbence 14 Мар 2011 в 12:29