首页 > 其他 > 详细

事务隔离性

时间:2019-07-21 23:31:25      阅读:100      评论:0      收藏:0      [点我收藏+]

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 查询数据展示:

技术分享图片

 

事务隔离性

原文:https://www.cnblogs.com/Uzai/p/11222821.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!