1.mysql四事务隔离级别
-
read uncommitted(未提交读):在read uncommitted级别,事务中的修改,即使没有提交,对其他事务也都是可见的。性能上不比其他的级别好很多,并且会导致很多问题的产生,实际中很少使用。
-
read committed(提交读/不可重复读):一个事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的。
-
repeatbale read(可重复读):mysql默认隔离级别,在同一个事务中多次读取同样记录的结果是一致的。可能会造成幻读,但结合MVCC可以解决幻读问题。
-
serializable(可串行化):最高的隔离级别,在读取的每一行数据上都加锁,导致大量的超时和的锁争用的问题,实际很少用
2.不同事务级别产生的影响
隔离级别 | 脏读 | 不可重复读 | 幻读 | 加锁读 |
---|---|---|---|---|
read uncommitted | √ | √ | √ | × |
read committed | × | √ | √ | × |
repeatbale read | × | × | √ | × |
serializable | × | × | × | √ |
## 查看事务日志是否开启
## mysql默认采用自动提交模式。如果不是显式地开始一个事务,则每个查询都被当做一个事务执行提交操作。
show variables like 'autocommit';
## 设置当前会话事务日志隔离级别
set transaction isolation level read committed;
## 查看当前默认隔离级别
select @@tx_isolation;
3.mysql的锁
a.根据不同方式进行分类:
1)加锁机制:乐视和悲观
2)兼容性:共享和排他
3)锁粒度:表锁,页锁,行锁
4)锁模式:记录锁,gap锁,next-key锁,意向锁,插入意向锁
b.锁概念解析:
- 读锁(共享锁):不能写可并行读
- 写锁(排他锁):读写阻塞,在增删改的时候回加上写锁。innodb存储引擎下只select不加任何锁
- 间隙锁:Gap Locks和Next-Key Locks。Gap Locks锁住两个索引之间的区间;Next-Key Locks是Gap Locks+Record Locks形成闭区间。
- 行锁:锁定当前数据行,粒度小,加锁慢,发生锁冲突的概率小,并发度高
- 表锁:阻塞写,不阻塞读。锁定当前表,粒度大,加锁快,开销小,发生锁冲突的概率大,并发度低。
- 死锁:指两个或多个的事务在同一资源上相互的占用,并请求锁定对方占用的资源,导致恶性循环的现象。
c.间隙锁介绍:
间隙锁:
- 最简单的行锁,仅仅锁住一行
- 记录锁永远都是加在索引上的,即便表没有索引,innodb也会隐式的创建一个索引,并使用这个索引实施记录锁
- 会阻塞其他事务对其的增删改
Gap Locks
- 间隙锁是一种加在两个索引之间的锁, 或者加在第一个索引之前,或者最后一个索引之间的间隙
- 使用间隙锁住的是一个区间
- 间隙锁只阻止其他事务插入到间隙中,而不会阻止其他事务在同一个间隙上获得间隙锁,因此,gap x lock和gap s lock有相同作用的
Next-Key锁
- 记录锁和间隙锁的组合,它指的是加在某条记录以及这条记录前面间隙上锁
4.innodb的意向锁
- 意向共享锁(IS):当一个事务在获取资源需要加共享锁定时,遇到已经被其他排他锁占用的时候,该事务则可以在该表上加意向锁,即意向共享锁
- 意向排他锁(IX):当一个事务在获取资源需要加排他锁定时,遇到已经被其他排他锁占用的时候,该事务则可以在该表上加意向锁,即意向排他锁
- 意向锁是表级别的锁定。意向共享锁可以同时并存多个,但意向排他锁只能存在一个
- 意向锁是innodb自动添加的,不需要用户干预
5.锁共存的逻辑关系
共享锁 | 排他锁 | 意向共享锁 | 意向排他锁 | |
---|---|---|---|---|
共享锁 | 兼容 | 冲突 | 兼容 | 冲突 |
排他锁 | 冲突 | 冲突 | 冲突 | 冲突 |
意向共享锁 | 兼容 | 冲突 | 兼容 | 兼容 |
意向排他锁 | 冲突 | 冲突 | 兼容 | 兼容 |
1.InnoDB目前处理死锁的方法是将持有最少行级排他锁的事务进行回滚。
2.InnoDB采用的是两阶段锁定协议(two-phase locking protocol):在事务执行过程中,随时都可以执行锁定,锁只有的再执行commit或者rollback时才会释放,并且是所有的锁在同一时刻被释放。InnoDB会根据隔离级别在需要的时候自动加锁。
注意:除了事务中禁用了autocommit可以使用lock tables外,其他任何时候都不要显式地执行lock tables,不管使用的是什么存储引擎。
##显式锁定
select … lock in share mode
select … for update