一、并发事务访问相同记录的三种情况
-
读-读情况
并发事务相继读取相同的记录,不会产生什么问题。 -
写-写情况
这种情况下会发生脏写的问题。 -
读-写或写-读情况
会发生脏读、不可重复读、幻读的情况
并发问题的解决方案
- 读操作利用多版本并发控制,写操作进行加锁
- 读写操作都采用加锁的方式
二、锁的不同分类
2.1、从数据操作角度分:读锁、写锁
- 读锁:共享锁,用
S
表示,对于同一份数据的读操作可以同时进行不影响,相互不阻塞。 - 写锁:排他锁,用
X
表示,在当前写操作没有完成前,它会阻断其他写锁和读锁。
锁定读时对读取记录加S锁
SELECT ... LOCK IN SHARE MODE;
#或者
SELECT ... FOR SHARE;
锁定读时对读取记录加X锁
SELECT ... FOR UPDATE;
2.2、从数据操作粒度分:表级锁、页级锁、行锁
锁粒度是由于数据库系统需要在高并发响应和系统性能两方面进行平衡所产生的概念。
2.2.1、表锁
该锁会锁定整张表,开销最小且避免了死锁,但是并发效率大打折扣。
表级别的S锁、X锁
LOCK TABLES t READ
:InnoDB
引擎对表t
添加表级别的S锁
。LOCK TABLES t WRITE
:InnoDB
引擎对表t
添加表级别的X锁
。
在InnoDB上使用这些语句只会降低并发能力,所以一般不使用。
意向锁
在一个事务在设置行锁的时候其他事务就需要去遍历这张表