Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да избегнем MySQL 'Намерено заключване при опит за заключване; опитайте да рестартирате транзакцията"

Един лесен трик, който може да помогне при повечето блокирания, е сортирането на операциите в определен ред.

Получавате блокиране, когато две транзакции се опитват да заключат две заключвания при противоположни поръчки, т.е.:

  • връзка 1:ключ за заключване (1), ключ за заключване (2);
  • връзка 2:ключ за заключване (2), ключ за заключване (1);

Ако и двете се изпълняват едновременно, връзка 1 ще заключи ключ (1), връзка 2 ще заключи ключ (2) и всяка връзка ще изчака другата да освободи ключа -> застой.

Сега, ако промените заявките си така, че връзките да заключват ключовете в същия ред, т.е.:

  • връзка 1:ключ за заключване (1), ключ за заключване (2);
  • връзка 2:ключ за заключване (1 ), ключ за заключване (2 );

ще бъде невъзможно да се стигне до безизходица.

Ето какво предлагам:

  1. Уверете се, че нямате други заявки, които да заключват достъпа до повече от един ключ наведнъж, освен оператора delete. ако го направите (а подозирам, че го правите), подредете техните WHERE в (k1,k2,..kn) във възходящ ред.

  2. Коригирайте оператора за изтриване да работи във възходящ ред:

Промяна

DELETE FROM onlineusers 
WHERE datetime <= now() - INTERVAL 900 SECOND

До

DELETE FROM onlineusers 
WHERE id IN (
    SELECT id FROM onlineusers
    WHERE datetime <= now() - INTERVAL 900 SECOND 
    ORDER BY id
) u;

Друго нещо, което трябва да имате предвид, е, че MySQL документацията предполага, че в случай на застой клиентът трябва да опита отново автоматично. можете да добавите тази логика към вашия клиентски код. (Да речем, 3 опита за тази конкретна грешка, преди да се откажете).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MAX() – Намерете максималната стойност в колона в MySQL

  2. Как да напиша REST API?

  3. Как трябва да съхранявам GUID в MySQL таблици?

  4. MySQL:@променлива срещу променлива. Каква е разликата?

  5. Списък на MySQL спецификаторите за формат на дата