sql >> Database teknologi >  >> RDS >> Mysql

Deadlock ved hjælp af SELECT ... TIL OPDATERING i MySQL

Hvad virker, og hvad gør ikke

En måde at få begge transaktioner til at køre igennem uden dødvande er at ændre isolationsniveau til LÆS FORPLIGTET (eller LÆS UKOMMITTERET ) i begge forbindelser:

SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
 

(før start transaction ).

Det ville sandsynligvis være nok at sætte det i t2 , men for at være sikker på eksemplet, sæt det i begge dele.

Ændring af isolationsniveauet for transaktioner introducerer nogle bivirkninger, som man bør informere om i manualen før du ændrer dette i et produktionsmiljø.

Statusoplysninger vedrørende dødvande

------------------------ LATEST DETECTED DEADLOCK ------------------------ 140424 8:45:46 *** (1) TRANSACTION: TRANSACTION B6F18A3, ACTIVE 5 sec starting index read mysql tables in use 1, locked 1 LOCK WAIT 2 lock struct(s), heap size 376, 1 row lock(s) MySQL thread id 13885, OS thread handle 0x7f8b1dbd2700, query id 901012 localhost root statistics SELECT * FROM t WHERE id = 1 FOR UPDATE *** (1) WAITING FOR THIS LOCK TO BE GRANTED: RECORD LOCKS space id 0 page no 22921 n bits 72 index `PRIMARY` of table `test`.`t` trx id B6F18A3 lock_mode X locks rec but not gap waiting Record lock, heap no 4 PHYSICAL RECORD: n_fields 4; compact format; info bits 0 0: len 4; hex 80000001; asc ;; 1: len 6; hex 00000b6f1883; asc o ;; 2: len 7; hex 06000059a211ea; asc Y ;; 3: len 5; hex 48656c6c6f; asc Hello;; *** (2) TRANSACTION: TRANSACTION B6F18A2, ACTIVE 10 sec starting index read mysql tables in use 1, locked 1 3 lock struct(s), heap size 376, 2 row lock(s) MySQL thread id 13888, OS thread handle 0x7f8b1f64d700, query id 901068 localhost root Updating UPDATE t SET `descc` = 'Hello from t1' *** (2) HOLDS THE LOCK(S): RECORD LOCKS space id 0 page no 22921 n bits 72 index `PRIMARY` of table `test`.`t` trx id B6F18A2 lock_mode X locks rec but not gap Record lock, heap no 4 PHYSICAL RECORD: n_fields 4; compact format; info bits 0 0: len 4; hex 80000001; asc ;; 1: len 6; hex 00000b6f1883; asc o ;; 2: len 7; hex 06000059a211ea; asc Y ;; 3: len 5; hex 48656c6c6f; asc Hello;; *** (2) WAITING FOR THIS LOCK TO BE GRANTED: RECORD LOCKS space id 0 page no 22921 n bits 72 index `PRIMARY` of table `test`.`t` trx id B6F18A2 lock_mode X waiting Record lock, heap no 4 PHYSICAL RECORD: n_fields 4; compact format; info bits 0 0: len 4; hex 80000001; asc ;; 1: len 6; hex 00000b6f1883; asc o ;; 2: len 7; hex 06000059a211ea; asc Y ;; 3: len 5; hex 48656c6c6f; asc Hello;; *** WE ROLL BACK TRANSACTION (1)

Forklaring

Som a_horse_with_no_name nævnte, virker dette som en fejl i MySQL. Transaktion (2) ønsker at opnå en spaltelås på den samme række, som den allerede har en X-lås. Transaktion (1) venter på en ikke-gab X-lås på denne række. Det er ikke klart for mig, hvorfor disse anmodninger skulle være i konflikt. Indstilling af isolationsniveauet til READ COMMITTED deaktiverer spaltelåsning. Da eksemplet fungerer derefter, er dette et hint om, at spaltelåsning faktisk er problemet her.




  1. tjek for gyldig dato, som er erklæret i varchar2

  2. Hvordan uploader man PHP-billede og indsætter sti i MySQL?

  3. Database backup kryptering - bedste praksis

  4. MySql SELECT union for forskellige kolonner?