参考文档
事务隔离级别
- Read Uncommited
- 可以读取未提交记录。此隔离级别,不会使用,忽略。
- Read Committed (RC)
- 一个事务可能会遇到不可重复读(Non Repeatable Read)的问题。
- 在一个事务内,多次读同一数据,在这个事务还没有结束时,如果另一个事务恰好修改了这个数据,那么,在第一个事务中,两次读取的数据就可能不一致。
- Repeatable Read (RR)
- Serializable
多版本并发控制
读不加锁,读写不冲突
快照读,不加锁
select * from table where ?;
当前读,加锁
-- select 上共享锁
select * from table where ? lock in share mode;
-- for update 上排它锁
select * from table where ? for update;
-- 插入,更新,删除 上排它锁
insert into table values (…);
update table set ? where ?;
delete from table where ?;
锁类型
X锁:排它锁
S锁:in share mode,允许别人也上S锁,保证大家都查到最新的数据
gap锁: 索引排列
意向锁( Intention Locks )
InnoDB为了支持多粒度(表锁与行锁)的锁并存,引入意向锁。意向锁是表级锁,
IS: 意向共享锁
IX: 意向排他锁
事务在请求某一行的S锁和X锁前,需要先获得对应表的IS、IX锁。
意向锁产生的主要目的是为了处理行锁和表锁之间的冲突,用于表明“某个事务正在某一行上持有了锁,或者准备去持有锁”。比如,表中的某一行上加了X锁,就不能对这张表加X锁。
如果不在表上加意向锁,对表加锁的时候,都要去检查表中的某一行上是否加有行锁,多麻烦。