事务的隔离级别

看了很多关于事务的隔离级别的文章,说老实话,举的例子都非常好,让人很容易理解,但是我总是没有搞清楚幻读与不可重复读的真正区别,所以决定自己在dos窗口中好好研究一下,然后便有了这篇文章。如果你也对不可重复读和幻读的理解有些问题,那么这篇文章可能会对你有帮助。

首先,事务的隔离级别有4个:由低到高分别为Read uncommitted 、Read committed 、Repeatable read 、Serializable。而且,在事务的并发操作中可能会出现脏读,不可重复读,幻读。

第一种,Read uncommitted,即读未提交。举例1:开启事务A和事务B:,在事务A中向数据库中插入一条数据,暂不提交,但是在事务B中却能够读取到事务A中提交的那条数据,那么若事务A不提交,回滚了,则事务B中读取到的数据是脏数据,这就是脏读。

那么为了避免脏读,就需要提高事务的隔离级别,即Read committed,读已提交,从这个翻译过来的中文意思可以看出,就是在事务B中只能读到其他事务已提交的数据。举例2:开启事务A和事务B,在事务A中向数据库中插入一条数据,暂不提交,在事务B中访问数据库是访问不到事务A提交的那条数据的,这有效的避免了脏读。但是又出现了新的问题,若这时事务A提交,成功向数据库插入数据,那么在事务B中再次访问数据库却能够访问到这条数据,那么在事务B中前后同样的查询语句却查询到了不同的查询结果,这就是不可重复读(不过说老实话,这跟后面的幻读,让我搞混了很久。。)。

在事务隔离级别为Read committed的时候,解决了脏读,但是又出现了不可重复读。那么在这个时候又需要提升隔离级别了,即Repeatable read,可重复读。那么可重复读是如何解决不可重复读的问题的呢?举例3:同样开启事务A和事务B,在事务A中向数据库中插入一条数据,暂不提交。然后在事务B中访问数据库,是查询不到该条数据的。那么这时事务A提交,成功向数据库中插入数据,这个时候再在事务B中访问数据库,仍然访问不到该条数据。这,就解决了不可重复读。事务B更像是一个节点,就比如银行在每年的12月31号的凌晨会扎帐,那么在这个时间点肯定不排除还有用户在进行交易或什么的,那么就跟例子2一样,银行在12月31日凌晨的时候准时开启一个事务,用来查询该时间点的数据,那么这时就算有人进行了转账的操作,那么也不会将这个数据统计进去,这样是不是就能够得到解决了呢?但是又出现了新的问题,开启事务B的用户提交了事务B,但是他这个时候再次开启一个事务C,输入刚刚在事务B中同样的查询语句,但结果却不一样了。这就是幻读或者幻象读。

那么在这里我需要总结一下个人的想法:因为我在学习初期的时候一直将不可重复读和幻读搞混了,可能也有同样困惑的人(如果没有就可以不看了,免得把你自己的思路搞混)。针对不可重复读和幻读,我认为不可重复读是针对同一事务下的相同查询,即在举例2中,事务B一直是开启的,但是在开启过程中进行了同样的查询,却出现了不同的结果,这就是不可重复读;那么幻读是什么呢?我认为幻读是同一个用户,在段时间内在不同的事务下进行相同的查询,却得到了不同的结果。

要解决幻读,就要继续提高隔离级别,即最高隔离级别Serializable,串行化。举例4:这里有一个数据库其中有两个表,表一和表二。然后开启事务A和事务B,第一种情况,事务A对表一进行了查询,那么事务B也能对表一进行查询,这种情况是不冲突的;第二种情况,事务A对表一进行了增删改其中的任意一种操作,那么这时在事务B中再对表一进行操作,则不管是增删改查的哪一种都会被阻塞,必须等待事务A提交或者回滚,才能继续执行(在测试中发现,如果在这种情况下事务A长时间没有提交,事务B阻塞时间过长,数据库则会报错,错误信息如下:ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction,即若被阻塞时间过长,会直接退出当前事务);第三种情况,事务A对表一进行了查询操作,那么在事务B中如果对表一进行增删改的操作,就会被阻塞。在以上三种情况中,若事务A中只操作了表一,那么则不会影响事务B对表二的任何操作。即,得出结论:在同时进行的相同数据库的事务中,只要其中的某一个事务对该数据库中的任何一个表进行了操作,那么就可以参照以上的三种情况进行分析。

最后,以上是我个人经过或许不全面的测试之后的理解,如有错误,还请指出!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值