You are on page 1of 5

https://dev.mysql.com/doc/refman/8.0/en/innodb-deadlock-example.

html

pentru a crea 2 sesiuni, este nevoie sa creeat 2 conexiuni diferite din workbench

Exemplul 1:

Folosind baza de date employees:

SET GLOBAL innodb_print_all_deadlocks = 1;

Sesiunea 1:

START TRANSACTION;

SELECT * FROM employees WHERE emp_no = 10001 FOR UPDATE;

UPDATE employees SET first_name = 'John' WHERE emp_no = 10001;

Sesiunea 2:

START TRANSACTION;

SELECT * FROM employees WHERE emp_no = 10002 FOR UPDATE;

UPDATE employees SET first_name = 'Jane' WHERE emp_no = 10002;

Exemplul 2:

create database deadlocks;

use deadlocks;

CREATE TABLE foo (id INT) ENGINE INNODB;

1
-- session 1 session 2
-----------------------------------------------------------------------
-
BEGIN;
-----------------------------------------------------------------------
-
BEGIN;
-----------------------------------------------------------------------
-
INSERT INTO foo VALUES (1);
-----------------------------------------------------------------------
-
INSERT INTO foo VALUES (2);
-----------------------------------------------------------------------
-
UPDATE foo SET id = 2 WHERE id = 1;
-----------------------------------------------------------------------
-
UPDATE foo SET id = 4 WHERE id =
2;

Exemplul 3

CREATE TABLE U ( -- user


id int not null primary key,
name varchar(222)
);

CREATE TABLE O ( -- object


id int not null primary key,
name varchar(222)
);

CREATE TABLE OU ( -- user <-> object


id int not null auto_increment primary key,
object_id int,
user_id int,

-- (object_id, user_id) should be UNIQUE (not enforced by a constraint)


CONSTRAINT fk_object_id FOREIGN KEY (object_id) REFERENCES O(id) ON DELETE
CASCADE,

2
CONSTRAINT fk_user_id FOREIGN KEY (user_id) REFERENCES U(id) ON DELETE
CASCADE
);

INSERT INTO U VALUES (1, 'foo'), (2, 'bar');

-- Start 2 concurrent transactions (A, B)

BEGIN; -- A
BEGIN; -- B
INSERT INTO O VALUES (1, 'a'); -- A
INSERT INTO O VALUES (2, 'b'); -- B
SAVEPOINT s_a; -- A
SAVEPOINT s_b; -- B
SELECT * FROM OU WHERE object_id = 1 FOR UPDATE; -- A
SELECT * FROM OU WHERE object_id = 2 FOR UPDATE; -- B
INSERT INTO OU(object_id, user_id) VALUES (1, 1); -- A
INSERT INTO OU(object_id, user_id) VALUES (2, 1); -- B

Rezultat:

16:24:04 INSERT INTO OU(object_id, user_id) VALUES (2, 1) Error Code: 1213. Deadlock
found when trying to get lock; try restarting transaction 0.015 sec

-- A deadlock-uri pe serverul MySQL printr-o setare globală:

SET GLOBAL innodb_print_all_deadlocks = 1;

-- Puteți interoga serverul pentru a verifica starea curentă a valorii de configurare:

select @@innodb_print_all_deadlocks;

-- Fișierul de jurnal în care se scrie de obicei este în /var/log/mysqld.log

-- Vizualizați cel mai recent deadlock:

SHOW ENGINE INNODB STATUS;

3
SHOW ENGINE INNODB STATUS;

------------------------

LATEST DETECTED DEADLOCK

------------------------

2023-06-17 16:24:04 0x20c8

*** (1) TRANSACTION:

TRANSACTION 54511, ACTIVE 106 sec inserting

mysql tables in use 1, locked 1

LOCK WAIT 5 lock struct(s), heap size 1128, 3 row lock(s), undo log entries 2

MySQL thread id 16, OS thread handle 12876, query id 1546 localhost ::1 root update

INSERT INTO OU(object_id, user_id) VALUES (1, 1)

*** (1) HOLDS THE LOCK(S):

RECORD LOCKS space id 268 page no 5 n bits 72 index fk_object_id of table `deadlock`.`ou` trx id 54511
lock_mode X

Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0

0: len 8; hex 73757072656d756d; asc supremum;;

*** (1) WAITING FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 268 page no 5 n bits 72 index fk_object_id of table `deadlock`.`ou` trx id 54511
lock_mode X insert intention waiting

Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0

0: len 8; hex 73757072656d756d; asc supremum;;

*** (2) TRANSACTION:

TRANSACTION 54512, ACTIVE 95 sec inserting

4
mysql tables in use 1, locked 1

LOCK WAIT 5 lock struct(s), heap size 1128, 4 row lock(s), undo log entries 2

MySQL thread id 18, OS thread handle 6536, query id 1548 localhost ::1 root update

INSERT INTO OU(object_id, user_id) VALUES (2, 1)

*** (2) HOLDS THE LOCK(S):

RECORD LOCKS space id 268 page no 5 n bits 72 index fk_object_id of table `deadlock`.`ou` trx id 54512
lock_mode X

Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0

0: len 8; hex 73757072656d756d; asc supremum;;

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 268 page no 5 n bits 72 index fk_object_id of table `deadlock`.`ou` trx id 54512
lock_mode X insert intention waiting

Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0

0: len 8; hex 73757072656d756d; asc supremum;;

*** WE ROLL BACK TRANSACTION (2)

Articol interesant: https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=9832868

https://blog.renoki.org/understanding-lockforupdate-and-sharedlock-in-laravel

You might also like