Как избежать состояния гонки при использовании счетчика, который считывается и увеличивается на два соединения? - PullRequest
1 голос
/ 09 декабря 2011

Например, у меня «Connection1» хочет увеличить счетчик «currentcount», а затем выбрать значение.«Connection2» хочет сделать то же самое и работает в то же время.Это запросы, которые выполняются (но не как транзакция).

Query 1: UPDATE table SET currentcount=currentcount+1;
Query 2: SELECT currentcount FROM table;

Если Connection1 и Connection2 одновременно запускают Query1, а затем Query2 в то же время, то результат запроса2 будетбыть одинаковым для обоих соединений (т. е. состояние гонки).

Я слышал, что транзакции могут работать в этой ситуации.Как бы я решил эту проблему в MySQL?

1 Ответ

1 голос
/ 09 декабря 2011

Вам необходимо:

LOCK `table`
...
UNLOCK `table`

Имейте в виду, что это может существенно повлиять на параллельную производительность, так как по необходимости вы должны помешать второму соединению делать что-либо одновременно спервое соединение (и наоборот).Однако это должно стать проблемой только в том случае, если вы выполняли эту операцию тысячи раз в секунду.

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

...