Deadlock в MySQL



Это магическое пугающее слово deadlock =)

Получить его в мускуле достаточно просто:

Transaction #1
BEGIN;
SELECT * FROM `testlock` WHERE id=1 LOCK IN SHARE MODE; /* GET S LOCK */
SELECT SLEEP(5);
SELECT * FROM `testlock` WHERE id=1 FOR UPDATE; /* TRY TO GET X LOCK */
COMMIT;

Transaction #2
BEGIN;
SELECT * FROM `testlock` WHERE id=1 FOR UPDATE; /* TRY TO GET X LOCK - DEADLOCK AND ROLLBACK HERE */
COMMIT;

Первая транзакция лочит данные, вторая пытается получить лок ДРУГОГО типа этих же данных и ждет, в это время первая транзакция тоже хочет получить еще и блокировку ДРУГОГО типа. В итоге они ждут друг друга и так до бесконечности.

Описание ситуации.

Share Button