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