百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>数据库> MySQL数据库的事务隔离和MVCC的细致介绍(图文)
分享文章到:

MySQL数据库的事务隔离和MVCC的细致介绍(图文)

发布时间:08/01 来源:未知 浏览: 关键词:
?本篇文章给大家带来的内容是对于MySQL数据库的事务隔离和MVCC的细致介绍(图文),有一定的参照 价值,有需要的伴侣可以参照 一下,但愿对你有所帮忙。

本篇文章给大家带来的内容是对于MySQL数据库的事务隔离和MVCC的细致介绍(图文),有一定的参照 价值,有需要的伴侣可以参照 一下,但愿对你有所帮忙。

前言:事务是拜访数据库的一个操纵序列,数据库利用系统通过事务集来完成对数据库的存取.

1. 什么是事务?

事务必需听从ISO/IEC所拟定的ACID准则。ACID是原子性(atomicity)、一致性(consistency)、隔离性(isolation)、耐久性(durability)的缩写,这四种状态的意思是:
1.原子性(Atomicity)
  原子性是指事务包括的所有操纵要末全部成功,要末全部失败回滚,这和前面两篇博客介绍事务的功能是同样的概念,因而事务的操纵要是成功就必需要完全利用到数据库,要是操纵失败则不克不及对数据库有任何影响。
2.一致性(Consistency)
  一致性是指事务必需使数据库从一个一致性状态变换到另一个一致性状态.
3.隔离性(Isolation)
  在事务准确提交以前,不允许把事务对该数据的转变供给给任何其他事务,即在事务准确提交以前,它可能的效果不该该显示给其他事务.
4.耐久性(Durability)
  耐久性是指一个事务一旦被提交了,那么对数据库中的数据的转变就是永恒性的,即使是在数据库系统碰到故障的状况下也不会遗失提交事务的操纵。

2. 事务的作用

当多个线程都开启事务操纵数据库中的数据时,数据库系统要能进行隔离操纵,以保障各个线程猎取数据的正确性.

3. 碰到的并提问题

1.首先类遗失更新:A事务撤销时,把已经提交的B事务的更新数据遮盖了.
2.第二类遗失更新:A事务遮盖B事务已经提交的数据,造成B事务所做操纵遗失.
3.脏读:A事务读取了事务B中未提交的数据.
4.不成反复读:A事务屡次读取的值不一样,由于该值被B事务修改并提交了.
5.幻读:A事务两次读之间,B事务插入了数据.

4. 怎样解决上面的题目呢?

为理解决上面的题目,开发者为MySQL数据库设计了下列四种事务隔离级别:
1.Read Uncommitted(未提交读):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据.

2.Read Committed(提交读):只能读取到已经提交的数据。Oracle等多数数据库默许都是该级别 (不反复读).

3.Repeated Read(可反复读):可反复读。在统一个事务内的查询都是事务开端时刻一致的,InnoDB默许级别。在SQL规范中,该隔离级别消弭了不成反复读,但是还存在幻象读,但是innoDB解决了幻读.

4.Serializable(串行读):完全串行化的读,每次读都需要获得表级同享锁,读写彼此都会阻塞.

隔离级别脏读不成反复度不幻读
Read Uncommitted(未提交读)可能可能可能
Read Committed(提交读)不成能可能可能
Repeated Read(可反复读)不成能不成能可能
Serializable(串行读)不成能不成能不成能

5. 小尝试

1.查看全局或会话的事务隔离级别

SELECT @@global.tx_isolation, @@tx_isolation;

在概括多版本控制中我们先来看下源码:

函数:read_view_sees_trx_id。
read_view中保留了目前全局的事务的范畴:
【low_limit_id, up_limit_id】

1.当行记载的事务ID小于目前系统的最小流动id,就是可见的。
      if (trx_id < view->up_limit_id) {
            return(TRUE);
          }
2.当行记载的事务ID大于目前系统的最大流动id(也就是尚未分配的下一个事务的id),就是不成见的。
      if (trx_id >= view->low_limit_id) {
            return(FALSE);
          }
3.当行记载的事务ID在流动范畴之中时,推断可否在流动链表中,要是在就不成见,要是不在就是可见的。
      for (i = 0; i < n_ids; i++) {
            trx_id_t view_trx_id
              = read_view_get_nth_trx_id(view, n_ids - i - 1);
            if (trx_id <= view_trx_id) {
            return(trx_id != view_trx_id);
            }
          }

Read view 图解

结语:笔者水平有限,文中若有不当,请大家多多指教,MySQL数据库事务机制还有许多需要深入研究的,我们仍需一直研讨。

本篇文章到这里就已经全部完毕了,更多其他出色内容可以关注百分百源码网的MySQL视频教程栏目!

以上就是MySQL数据库的事务隔离和MVCC的细致介绍(图文)的细致内容,更多请关注 百分百源码网 其它相干文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有151人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板