事务隔离性

1. 脏读:未提交  读  read uncommit 事务A读取事务B未提交的数据

事务A 读取事务B更新的数据, 然后事务B回滚,那么A读取到的数据就是脏数据:

情景展示:

1. 会话B 可提交读

set SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

BEGIN
update account set balance = balance - 50 where id = 1

2. 会话A 读取表数据

set SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

select * from account

  

3. 此时会话A看到 id = 1的 balance = 350, 想要执行更新操作,350 - 50 =300

update account set balance = balance - 50 where id = 1

4. 在执行之前, 会话B 执行rollback 回滚了
5.然后结果并没有改变

 

2.已提交读:read COMMITTED:事务A 会读取到事务B已提交的数据

1. 新建一个会话,会话设置为 read committed 已提交读,然后开启一个事务

set SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED

BEGIN

执行更新语句:
update account set balance = balance - 50 where id = 1

2.新建一个会话,设置为已提交读,然后开启事务,查询表数据

set SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED

BEGIN

select * from account


读取到的数据仍然是400

 

3. 可重复读 REPEATABLE READ
可重复读和读已提交的效果很相似,
二者的区别是什么:当会话提交后, 在另一个会话中,查询的数据不变

原始数据

 

1.开启一个会话, 设置会话级别,可重复读,然后开启事务,更新操作

set SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ

BEGIN

update account set balance = balance - 50 where id = 1

2.开启另一个会话,设置会话级别,可重复读,然后开启事务,执行查询操作

set SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ

 

BEGIN

 

select * from account

3.会话1 提交事务 commit, 然后会话1查询数据展示:

4.会话2 查询数据展示:

 

posted @ 2019-07-21 21:59  new_boys  阅读(148)  评论(0编辑  收藏  举报