有关mysql的for update以及 死锁问题

Posted 天道酬勤,厚德载物

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有关mysql的for update以及 死锁问题相关的知识,希望对你有一定的参考价值。

一、先说锁的概念

锁级别:

1.行级锁: InnoDB引擎(也支持表级锁,默认是行级锁),开销大,加锁慢;会出现死锁。锁定粒度最小,发生锁冲突的概率最低,并发度最高。

2.表级锁:MylSAM引擎和Memory引擎,开销小,加锁快;不会出现死锁,锁定粒度最大,发生锁冲突的概率最高,并发度最低。

3.页级锁:BDB引擎(也支持表级锁),开销和加锁时间介于行锁和表锁之间;会出现死锁;粒度也介于行锁和表锁之间,并发度一般。

其中:锁粒度就是指锁等级

Record: RecordLock就是锁住某一行记录
Gap:GAPLOCK会锁住某一行范围的记录
Next-KeyLocks: 上面两者加起来的效果

行锁分为两种:

1.共享锁:S锁:select * from test where ... Lock in share mode; 一个事务对一行的共享只读锁

2.排他锁:X锁:select * from test where ... for update;         一个事务对一行的排他读写锁

二、

1.查看死锁日志命令: show engine innodb status \\G; 

具体死锁参考:https://segmentfault.com/a/1190000009469556

session 1:
select * from test where id = 1 for update;

session 2:
update test set name = "qq" where id =1;

当session1和session2同时运行的时候,session1中由于对id=1这行加锁(排它锁:在未解锁之前,其他事物不能对该行进行读写)。session2与session持有的行锁是冲突的。数据库需要避免这种冲突,就是说要让session2的申请被阻塞,直到session1释放了行锁。

 

以上是关于有关mysql的for update以及 死锁问题的主要内容,如果未能解决你的问题,请参考以下文章

在 SELECT ... INNER JOIN ... FOR UPDATE 的情况下,字符串的顺序是啥锁定以及如何避免死锁?

select for update 并发insert死锁问题

Mysql查询语句使用select.. for update导致的数据库死锁分析

涉及 SELECT FOR UPDATE 的死锁

SELECT FOR UPDATE 与子查询导致死锁

同一张表上的两个“SELECT FOR UPDATE”语句会导致死锁吗?