mysql deadlock found_mysql死锁 Deadlock found when trying to get lock; try restarting transaction

研究了一下mysql的死锁,记录如下。

比如有2个事务,执行的sql分别如下:

这里用 #N 标识sql语句的执行顺序,下面开启两个mysql客户端连接,其中表的id为主键。

事务1

START TRANSACTION; #1

UPDATE username SET `name` = 't1' WHERE id = 1; #3

UPDATE username SET `name` = 't1' WHERE id = 2; #5

COMMIT;

事务2

START TRANSACTION; #2

UPDATE username SET `name` = 't2' WHERE id = 1; #6

UPDATE username SET `name` = 't2' WHERE id = 2; #4

COMMIT;

死锁:当出现2个(以上)事务互相等待对方释放锁的时候就会出现死锁。

PS:不管两个事务执行什么sql语句,只要出现互相等待对方释放就发生了死锁问题。

1、当执行#1 #2时两条事务开始

2、当执行#3 时,事务1将id=1的这条数据加锁(当sql语句执行时才加锁,事务开始时不会加)

3、当执行#4 时,事务2将id=2的这条数据加锁

4、当执行#5 时,事务1等待事务2释放锁(锁是在事务提交以后才释放)

此时,通过information_schema库INNODB_TRX事

你可能感兴趣的:(mysql,deadlock,found)