关于对事务隔离性的深入理解

我们都知道事务具有四大特征(原子性、一致性、隔离性、持久性),此篇博客我们将对其隔离性进行更加深层次的理解

1.隔离性的目的在于使客户端从mysql服务器中对事务进行的操作相互之间不产生影响,但不同的应用场景对其隔离性的要求有所不同。由此我们要介绍的是隔离等级

1.1隔离等级

下面四个隔离等级为由低到高

read uncommitted : 读未提交

read committed: 读已提交

repaeteble read: 可重复读

serializable: 串行化

隔离级别从低到高,“并发访问”的数据从高到低,数据安全性从低到高,性能越低

MYSQL默认的事务隔离级别是,可重复读

下面将展示有关隔离等级的sql代码:

在不同隔离等级下会产生不同隔离级别的现象:(我们将结合实例对其进行解释)

1.脏读:

脏读产生于read uncommitted : 读未提交 的隔离等级下

脏读的现象会出现在如下情况:当我们进行A事务中数据的修改过程时,此时我们并没有对数据进行提交或者回滚操作,而此时B事务恰好同样对同样的数据进行读取操作,这是所读取的是A中操作中的数据,而后来事务A发现它所修改的数据错误进行了回滚操作,而B不知道这是错误的数据,对读取到的数据进行操作,可能会产生错误。

那么该如何解决脏读的问题呢?
我们采用在进行写操作时进行加锁,即在进行写操作时不允许我们在此期间进行读取数据的操作,

这把锁我们称为写锁,写锁具有排他性(不允许其他操作的同时执行)

加上写锁就意味着我们的隔离等级进入了第二个阶段:read committed: 读已提交

2.不可重复读

这种现象出现于read committed: 读已提交的隔离等级下:
这种现象的意思如下:当我们A事务想要去读取数据,在A事务第一次读取结束之后 ,此时恰好B事务对这些数据进行了修改,此时A事务前后两次所读取的数据也就不同了,我们称这种现象为不可重复读

 

我们此时的解决方式如下:我们在进行读取操作时,加一把读锁,但是读锁是一把共享锁,也就意味着我们允许很多把读锁进行共同读取数据,但由于写锁是排他锁,,所以在读取数据期间不允许写入数据

 

 

 

这样我们隔离等级也进入了第三个阶段:repaeteble read: 可重复读,而事务默认的隔离等级也是这个等级

3.幻读:在不可重复读的问题解决后,我们对一组数据进行读或者写时,我们不能同时对他进行写或者读的操作(读不能写,写不能读),但是如果我们此时事务A对符合一定条件的数据进行查找时,此时B事务恰好对其中某组符合条件的数据进行修改,我们此时发现事务A第一次查找与第二次查找的结果集不相符,我们称这种现象为幻读

解决方式则是我们进行串行化操作:在事务A进行操作时,不允许另一个事务加入操作直到事务A结束操作

总结:我们对隔离等级进行规范,目的是要实现数据安全性要求的满足,而安全性越高,意味着我们对数据进行操作的并发性(允许多个事务同时操作)和效率也就越低

 

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

六子干侧开

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值