问题描述
在进行高并发性能调优的时候发现了如下的一个问题:
1. 在一个事务中同时包括了SELECT,UPDATE语句
2. SELECT和UPDATE涉及到的数据为同一张表中的同一记录
3. 在并发为10的情况下就会触发数据库锁等待和死锁的情况
问题分析
在问题分析之前引入几个概念
事务隔离级别
参考文章《事务的ACID特性》
共享锁(S锁)
SELECT 语句时对查询行加的锁类型为共享锁。
共享锁的特性为:不允许其他事务对该记录加排他锁,但是允许加共享锁。
保持时间:可重复度级别中共享锁会保持到事务结束。
排他锁(X锁)
MYSQL的默认隔离级别(可重复度)中,UPDATE,INSERT和DELETE语句对操作语句加的锁类型为排他锁
排他锁的特性为:不允许其他事务对该记录加共享锁和排他锁
保持时间:会保持到事务结束。
更新锁(U锁)
UPDATE语句在更新前需要对整表上更新锁,在找到记录后对需要操作记录上排他锁并释放更新锁
更新锁特性为:用来预定要对此页施加排他锁,它允许其他事务加共享锁,但不允许再施加更新锁或排他锁
保持时间:会保持到事务结束。
分析
在MYSQL中使用的默认隔离接级别为可重复读,那么SELECT语句在执行时会给记录增加共享锁,UPDATE语句会给数据上更新锁和排他锁,INSERT语句会给数据上排他锁(数据为新增,在事务结束之前是对其他事务不可见的,可忽略)。
这样

最低0.47元/天 解锁文章
3万+

被折叠的 条评论
为什么被折叠?



