1 隔离级别
1.0 隔离级别
序号 | 隔离级别 | 设置命令 | 查询隔离级别 |
---|---|---|---|
1 | 读未提交(read uncommitted) | 读取未提交(持久化)的数据 | set session transaction isolation level read uncommitted |
2 | 读已提交(read committed) | 读取已隐式提交(持久化)的数据 | set session transaction isolation level read committed |
3 | 可重复读(repeatable read) | 一个事务读取另一个事务已隐式提交(持久化)的数据,但第一次读取的数据,即使其他事务修改,获取的仍不变 | set session transaction isolation level repeatable read; |
4 | 串行化(serializable) | 读-读并发,只要有一个事务写,其他所有事务访问(读,写)该条数据,都需等待 | set session transaction isolation level serializable |
1.2 隔离级别作用
序号 | 隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|---|
1 | 读未提交 | Y | Y | Y |
2 | 读已提交 | N | Y | Y |
3 | 可重复读 | N | N | Y |
4 | 串行化 | N | N | N |
2 解析
开启mysql事务:begin;命令并未实际开启一个事务,只有增删改查会开启一个事务.
2.1 读未提交
事务A | 事务B |
---|---|
begin; | - |
insert into transaction_test (score) values (66); | begin; |
- | select * from transaction_test; |
rollback; | select * from transaction_test; |
commit; | commit; |
即使事务A未提交,事务B仍可读到事务A修改但未提交的数据,即脏读.
2.2 读已提交
事务A | 事务B |
---|---|
begin; | - |
update transaction_test score=88 where id=2; | begin; |
- | select * from transaction_test; |
- | select * from transaction_test; |
commit; | - |
- | select * from transaction_test; |
读已提交自带幻读属性,只要提交,就会读取.
2.3 可重复读
2.2.1 快照读(snapshot read)
事务A | 事务B |
---|---|
begin; | - |
insert into transaction_test (score) values (); | begin; |
- | select * from transaction_test; |
commit; | select * from transaction_test; |
- | commit; |
快照读:事务开启时,读取的数据库版本号为所有并发事务开启前的持久化版本号,所以,不会产生幻读.
2.2.2 当前读(current read)
事务A | 事务B |
---|---|
begin; | - |
insert into transaction_test (score) values (90); | begin; |
- | select * from transaction_test lock in share mode; |
- | (等待数据提交,此时锁住,读不到数据) |
commit; | 读取实时提交的数据,产生幻读 |
- | commit; |
读取数据库事务实时变化.开启两个事务,A和B,当事务B使用当前读时,事务A改变的数据会实时更新到事务B中,若插入数据,则产生幻读.
2.4 串行化
事务A | 事务B |
---|---|
begin; | begin; |
select * from transaction_test; | select * from transaction_test; |
update transaction_test set score=88 where id=2; | - |
等待 | - |
-等待 | commit; |
更新成功 | - |
commit; | - |
串行化:读-读并发,其他情况均是锁(阻塞),每次只能处理一个事务,顺序执行,如上,当事务A和事务B开启后,可同时查数据,当事务A更新数据时,事务B还为结束,事务A等待其他事务(B)结束,当事务B提交后,更新成功.
【参考文献】
[1]https://www.cnblogs.com/huanongying/p/7021555.html
[2]http://www.zsythink.net/archives/1233/
[3]https://baijiahao.baidu.com/s?id=1629344395894429251&wfr=spider&for=pc
[4]https://www.cnblogs.com/wdy1184/archive/2019/04/04/10655180.html
[5]https://www.cnblogs.com/liyus/p/10556563.html