2012-03-05 5 views
3

Чтобы заблокировать две строки в MySQL я должен использовать:Блокировка нескольких строк в MySQL (InnoDB)

SELECT * FROM <table> WHERE id=? OR id=? FOR UPDATE; 

Или:

SELECT * FROM <table> WHERE id=? AND id=? FOR UPDATE; 

я, очевидно, нахожусь внутри транзакции просто не уверены в том, что следует be AND или OR?

ответ

3

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

Для SELECT ... FOR UPDATE, замки приобретаются для сканируемых строк, и, как ожидается, будет выпущен для строк, которые не соответствуют требованиям для включения в набор результатов (например, если они не отвечают критерии, приведенные в предложении WHERE).

Update

Вы можете быть в состоянии использовать SHOW ENGINE INNODB STATUS, чтобы проверить, какие строки будут заблокированы для каждого типа SELECT.

Подробнее о считывании замка here и here.

+1

Неважно, это И ИЛИ ИЛИ, ИМО. См. Ответ @ jleahy. – thekingoftruth

6

Если ваше предложение WHERE равно id=1 AND id=2, тогда никакие строки не будут допущены к включению в результирующий набор, и поэтому никакие строки не будут заблокированы.

Чтобы заблокировать обе строки, вам необходимо использовать id=1 OR id=2, таким образом обе строки будут включены в результирующий набор и будут заблокированы.

Смежные вопросы