блокировка одного и того же стола дважды - PullRequest
0 голосов
/ 15 декабря 2010

Я использую SELECT...FOR UPDATE запросов для блокировки таблицы.К сожалению, у меня есть ситуация, когда мне нужно заблокировать два разных набора строк в одной и той же таблице, например:

SELECT * FROM mytable WHERE attribute1 = 'something' FOR UPDATE
SELECT * FROM mytable WHERE attribute2 = 'somethingelse' FOR UPDATE
UPDATE mytable SET  attribute2 = 'somethingnew' WHERE somethingelse

Мне нужно заблокировать оба набора строк.Что я делаю, так это проверяю, чтобы ни один из объектов в таблице не находился в определенном состоянии, а затем нахожу другие объекты, которые можно перевести в это состояние, и помещаю их туда.Цель состоит в том, чтобы удовлетворить определенные ограничения, которые слишком сложны, чтобы быть закодированными в mysql.

Итак ... вопрос в том, что происходит, когда я SELECT...FOR UPDATE дважды из одной таблицы внутри одной транзакции?Первая блокировка освобождается?Я видел доказательства того, что это так, но я не могу понять, как это подтвердить.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2011

Блокировки освобождаются только при фиксации или откате.С другой стороны, одна транзакция никогда не блокируется для себя.Таким образом, вышеприведенное должно быть в порядке, если только один поток делает это.

Если вышеупомянутый поток выполняется более чем одним потоком, я боюсь, что вы можете зайти в тупик.Если вы хотите этого, вам понадобится один оператор SQL, который блокирует оба набора одновременно, как, например, ответ Джейди выше.

0 голосов
/ 15 декабря 2010

Как насчет чего-то вроде

SELECT * FROM mytable WHERE attribute1 = 'something' 
    or attribute2 = 'somethingelse' FOR UPDATE

UPDATE mytable SET  attribute2 = 'somethingnew' WHERE somethingelse

Я не знаю ответа непосредственно на ваш вопрос, но в руководстве по MySQL говорится, что блокировка деблокирована после завершения транзакции (отправка или откат), что означает, что второй выбор не снимает блокировки. В вашем случае вам на самом деле не нужно два выбора.

...