数据库mysql阻塞与死锁
阻塞与死锁
阻塞:一个事务等待其他事务释放锁,阻塞超时事务默认不回滚
死锁:两个或以上事务持有锁,都在等待其他事务先释放锁,发生死锁事务会回滚
查看锁超时时间(InnoDb锁等待的超时时间默认为50s)
锁回滚超时开关
说明:事务获取锁超时默认不会回滚,可设置为on回滚事务
阻塞测试
数据库数据
事务操作
事务1 | 事务2 | |
T1 | select * from test where id>15 for update; | |
T2 | insert into test values(11,"瓜田李下11",21); | |
T3 | insert into test values(21,"瓜田李下21",21); |
事务1执行状态
start transaction
> OK
> 时间: 0s
select sleep(4)
> OK
> 时间: 4s
select * from test where id>15 for update
> Affected rows: 0
> 时间: 0.001s
select sleep(80)
> OK
> 时间: 80s
commit
> OK
> 时间: 0s
事务2执行状态
start transaction
> OK
> 时间: 0s
select sleep(4)
> OK
> 时间: 4s
insert into test values(11,"瓜田李下11",21)
> Affected rows: 1
> 时间: 0.018s
insert into test values(21,"瓜田李下21",21)
> 1205 - Lock wait timeout exceeded; try restarting transaction
> 时间: 50.546s
说明:id为11的数据插入成功,id为21的数据超时未插入
死锁测试
事务操作
事务1 | 事务2 | |
T1 | update test set age=11 where id=1; | |
T2 | update test set age=22 where id=2; | |
T3 | update test set age=12 where id=2; | |
T4 | update test set age=21 where id=1; |
事务1执行状态
start transaction
> OK
> 时间: 0s
select sleep(4)
> OK
> 时间: 4.001s
update test set age=11 where id=1
> Affected rows: 1
> 时间: 0.14s
select sleep(8)
> OK
> 时间: 8.001s
update test set age=12 where id=2
> Affected rows: 1
> 时间: 1.526s
commit
> OK
> 时间: 0.168s
事务2执行状态
start transaction
> OK
> 时间: 0s
select sleep(4)
> OK
> 时间: 4.001s
update test set age=22 where id=2
> Affected rows: 1
> 时间: 0.002s
select sleep(8)
> OK
> 时间: 8.002s
update test set age=21 where id=1
> 1213 - Deadlock found when trying to get lock; try restarting transaction
> 时间: 0.17s
说明:事务2检测到死锁回滚,事务1在事务2回滚释放锁后继续执行