я отслеживать пользователей кредитов в таблице creditlog, которая выглядит следующим образом:Mysql одновременно SELECT/INSERT
user quantity action balance
1001 20 SEND 550
1001 30 SEND 520
1001 5 SEND 515
Теперь я сначала попытался использовать активный синтаксис записи и выберите последний баланс затем вставить новую строку, вычислил новый баланс. Потом я оказался в состоянии гонки:
user quantity action balance
1001 20 SEND 550
1001 30 SEND 520
1001 5 SEND 545 (the latest balance was not picked up because of a race condition)
Следующая раствор с помощью одного запроса, чтобы сделать так:
INSERT INTO creditlog (action, quantity, balance, memberId)
VALUES (:action, :quantity, (SELECT tc.balance from creditlog tc where tc.memberId=:memberId ORDER by tc.id desc limit 1) - :quantity, :memberId);
Мой скрипт, который проверяет это с 10 Reqs/второй будет бросить следующее сообщение об ошибке для 2/10 запросов:
SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction. The SQL statement executed was:
INSERT INTO creditlog (action, quantity, reference, balance, memberId)
VALUES (:action, :quantity, :reference, (SELECT balance from (SELECT tm.* FROM creditlog tm where tm.memberId=:memberId) tc where tc.memberId=:memberId ORDER by tc.id desc limit 1) -:quantity, :memberId, :recipientId);.
Bound with :action='send', :quantity='10', :reference='Testing:10', :memberId='10001043'.
Не следует ли двигателю дождаться первой операции, чтобы освободить стол, а затем начать на втором?
Имеет ли моя проблема: How to avoid mysql 'Deadlock found when trying to get lock; try restarting transaction'?
Как я могу избежать этой ситуации и превращать параллельные запросы в последовательные операции?
ли вы действительно использовать этот запрос: '(SELECT tc.balance из creditlog ца где tc.memberId =: MemberID ORDER по tc.id предела по убыванию 1)'? В журнале показан другой запрос: '(SELECT balance from (SELECT tm. * FROM creditlog tm, где tm.memberId =: memberId) tc, где tc.memberId =: memberId ORDER по tc.id desc limit 1) -: quantity'. – krokodilko
Я снял некоторые неуместные столбцы. – Samson