文章详情

短信预约信息系统项目管理师 报名、考试、查分时间动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

MYSQL事务篇(高级篇)

2015-04-25 13:35

关注

MYSQL事务篇(高级篇)

 1.事务介绍:

2.数据库事务具有ACID四大特性

3.隔离级别:

  1)未提交读(READ UNCOMMITTED/RU) 如果一个事务读到了另一个未提交事务修改过的数据,那么这种 隔离级别 就称之为 未提交读 会产生脏读的情况

  2)   已提交读(READ COMMITTED/RC) 不可重复读:一个事务因读取到另一个事务已提交的update。导致对同一条记录读取两次以上的结果不一致。

  如果一个事务只能读到另一个已经提交的事务修改过的数据,并且其他事务每对该数据进行一次修改并提交后,该事务都能查询得到最新值,那么这种 隔离级别 就称之为 已提交读,会产生幻读的情况。

  3)可重复读(REPEATABLE READ/RR) 在一些业务场景中,一个事务只能读到另一个已经提交的事务修改过的数据,但是第一次读过某条记录后,

  即使其他事务修改了该记录的值并且提交,该事务之后再读该条记录时,读到的仍是第一次读到的值,而不是每次都读到不同的数据。那么这种 隔离级别 就称之为 可重复读,会产生幻读的情况。

  4)串行化(SERIALIZABLE) 最高的默认级别,强制事务串行执行(即一个事务一个事务执行)。效率极其低下。

  幻读:一个事务因读取到另一个事务已提交的insert数据或者delete数据。导致对同一张表读取两次以上的结果不一致。

  不可重复读: 一个事务因读取到另一个事务已提交的update。导致对同一条记录读取两次以上的结果不一致。

4.讲讲事务和MVCC底层原理详解:

 比如现在有一个例子:

一个转账的一个案例:

丢失更新

两个事务针对同一数据都发生修改操作时,会存在丢失更新问题。

4.1解决方案:LBCC:

使用LBCCLBCC,基于锁的并发控制,英文全称Lock Based Concurrency Control)可以解决上述的 问题。查询总额事务会对读取的行加锁,等到操作结束后再释放所有行上的锁。因为用户A的存款被锁,导致转账操作被阻塞,直到查询总额事务提交并将所有锁都释放。 示例:这种方案比较简单粗暴,就是一个事务去读取一条数据的时候,就上锁,不允许其他事务来操作    

4.2:解决方案2:MVVC:

MVCCMVCC,多版本的并发控制,英文全称:Multi Version Concurrency Control)机制可 以解决这个问题。查询总额事务先读取了用户A的账户存款,然后转账事务会修改用户A和用户B账户存 款,查询总额事务读取用户B存款时不会读取转账事务修改后的数据,而是读取本事务开始时的数据副(REPEATABLE READ隔离等级下) 只支持RC,RR隔离级别   示例:MVCC使得数据库读不会对数据加锁,普通的SELECT请求不会加锁,提高了数据库的并发处理能力

 

5.MysqlMVCC实现(重点):

 

5.1MVVC的实现机制:

mvvc是通过undo log+readview实现的:

undo log:

eadView:

  

       

句个列子比如:

 

 如果数据库没有活跃的事务,那么ReadView(m_ids)中包含的就是将要生成的事务id。

REPEATABLE READ(RR)隔离级别下,MVCC具体是如何操作的。

1.SELECT InnoDB 会根据以下两个条件检查每行记录: 1. InnoDB只查找版本早于当前事务版本的数据行(也就是,行的事务编号小于或等于当前事务的事务编号)  这样可以确保事务读取的行,要么是在事务开始前已经存在的,要么是事务自身插入或者修改过的。 2. 删除的行要事务ID判断,读取到事务开始之前状态的版本。 只有符合上述两个条件的记录,才能返回作为查询结果。 2.INSERT InnoDB为新插入的每一行保存当前事务编号作为行版本号。 3.DELETE InnoDB为删除的每一行保存当前事务编号作为行删除标识。 4.UPDATE InnoDB为插入一行新记录,保存当前事务编号作为行版本号,同时保存当前事务编号到原来的行作为行删除标识。

MVCC是如何解决隔离级别的呢?

RC事务隔离级别的实现:

读已提交:当前事务可以读取其他事务提交的结果

实现方案:当前事务执行select语句时会生产一个ReadView,如果再次执行这个selct语句继续生成ReadView。

RR事务隔离级别的实现:

可重复读:当前事务中执行的select语句的多次执行结果都是相同的,不管其他事务有没有提交。

实现方案:在当前事务执行select语句生产一个ReadView,之后同一个select使用同一个ReadView

RC和RR的区别:

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯