《MySQL技术内幕》读书笔记07--事务

概述
  • 特性:ACID

    • 原子性atomicity:事务中所有数据库操作都执行成功,事务成功,否则数据库回退到事务执行前的状态

    • 一致性consistency:事务将数据库从一种状态转变为下一种一致的状态,数据库的完整性约束没有被破坏

    • 隔离性isolation:事务的隔离性要求每个读写事务的对象对其他事务的操作对象能相互分离

    • 持久性durability:事物一旦提交,其结果就是永久的

  • 数据库事务的隔离级别:Oracle READ COMMITED, Innodb READ REPEATABLE

事务分类
扁平事务
  • 所有操作都处于同一层次,由BEGIN WORK开始,由COMMIT WORK或ROLLBACK WORK结束

  • 每个数据库系统都实现了对扁平事务的支持

  • 限制:不能提交或者回滚事务的某一部分,或者分几个步骤提交

带有保存点的扁平事务
  • 允许事务在执行过程中回滚到同一事务中较早的一个状态,不会导致所有的操作都无效

  • 保存点用来通知系统记住事务当前的状态,使用SAVE WORK 函数来建立

  • 保存点在事务内部是递增的,只有执行命令ROLLBACK WORK,才是完全回滚事务

  • 当系统发生崩溃时,所有的保存点都将消失,因为保存点是易失的

链事务
  • 在提交事务时,释放不需要的数据对象,将必要的处理上下文隐式的传给下一个要开始的事务

  • 是指 应该是 将多个事务合并成一个事务,所以事务回滚只能回到最近点,且上一事务结束和下一个事务开始是一个原子操作

  • 链事务在执行COMMIT后会释放的当前事务持有的锁

嵌套事务
  • 嵌套事务由若干事务组成的一棵树,子树可以是嵌套事务,也可以是扁平事务

  • 叶节点一定是扁平事务,子事务既可以提交也可以回滚。但是只有在父事务提交之后子事务才真正提交

  • 任一事务的会滚都会引起子事务一同回滚

分布式事务
  • 一个分布式环境下的扁平事务,需要根据数据所在位置访问网络中的不同节点(后续详解)
事务的实现
redo
  • 重做日志用来实现事务的持久性

  • innodb通过Force Log at Commit机制实现事务的持久性,当事务提交时,必须先将事务的所有日志写入到重做日志持久化,待Commit完成之后才算完成

log block
  • 重做日志块:重做日志缓存、重做日志文件都是以块的方式进行保存的,每块大小512字节
log group
  • 重做日志组,innodb只支持一个log group。是一个逻辑上的概念,没有物理文件对应
undo
  • 事务回滚所需的重做日志

  • 逻辑日志,只是将数据库逻辑的回复到原来的样子,当innodb回滚时,实际上做的事与之前相反的工作,insert->delete

  • MVCC通过undo实现,当用户读取记录时,如果该记录被其他事务占用,当前事务可以通过undo读取之前的行版本信息,实现非锁定读取

  • 事务提交后不马上删除undo log,这是因为其他事务通过undo log查询行记录之前的版本(如上),因此事务提交时将undo log放入到一个链表中,是否删除undo log由purge线程决定

  • DELETE操作并不直接删除记录,只是将记录标记为已删除,记录最终删除是在purge操作中完成

  • update操作:将原纪录标记为已删除,然后新插入一条记录

事务控制语句
  • 主要是开始、结束、回滚、创建/删除/回滚保存点

  • 在存储过程中使用START TRANSACTION,不用BEGIN

对于事务操作的统计
  • TPS:每秒事务的处理能力 = (com_commit+com_rollback)/time,前提是所有的事务都是显示提交的

SHOW GLOBAL STATUS LIKE 'com_commit'   #查看事务的提交数
分布式事务
  • InnoDB提供XA事务的支持,通过XA事务来支持分布式事务的实现。全局事务要求参与的所有事物要么都会滚,要么都提交

  • XA事务是由一个或者多个资源管理器、一个事务管理器、一个应用程序组成

  • 分布式事务使用两段式提交:第一阶段,所有参与全局事务的节点都开始准备,告诉事务管理器主备好提交了。第二阶段,事务管理器告诉资源管理器执行ROLLBACK或COMMIT,如果任何一个节点显示不能提交,那么所有节点回滚

  • Mysql内部存在分布式事务,binlog和存储引擎之间采用XA事务

不好的事务习惯
  1. 在循环中提交

  2. 自动提交事务

  3. 自动回滚事务

#MySQL##笔记##读书笔记#
全部评论

相关推荐

不愿透露姓名的神秘牛友
今天 12:31
以前小时候我最痛恨出轨、偷情的人,无论男女,为什么会出轨?现在我成了自己最讨厌的人,没想到分享的东西在牛客会被这么多人看,大家的评价都很中肯,我也认同,想过一一回复,但我还是收声了,我想我应该说说这件事,这件事一直压在我心里,是个很大的心结,上面说了人为什么出轨,我大概能明白了。我们大一下半年开始恋爱,开始恋爱,我给出了我铭记3年的承诺,我对她好一辈子,我永远不会背叛,我责任心太重,我觉得跟了我,我就要照顾她一辈子,我们在一起3年我都没有碰过她,她说往东我就往东,她说什么我做什么,她要我干什么,我就干什么!在学校很美好,中途也出过一些小插曲,比如男闺蜜、男闺蜜2号等等等。但我都强迫她改掉了,我...
牛客刘北:两个缺爱的人是没有办法好好在一起的,但世界上哪有什么是非对错?你后悔你们在一起了,但是刚刚在一起的美好也是真的呀,因为其他人的出现,你开始想要了最开始的自己,你的确对不起自己,21岁的你望高物远,你完全可以不谈恋爱,去过你想要的生活,你向往自由,在一起之后,你要想的不是一个人,而是两个人,你不是变心了,就像你说的,你受够了,你不想包容了,冷静几天是你最优的选择,爱人先爱己。
社会教会你的第一课
点赞 评论 收藏
分享
07-07 17:06
已编辑
深圳技术大学 golang
点赞 评论 收藏
分享
05-26 22:25
门头沟学院 Java
Java小肖:不会是想叫你过去把你打一顿吧,哈哈哈
点赞 评论 收藏
分享
练习生懒羊羊:开飞机把这个公司创飞吧
点赞 评论 收藏
分享
评论
点赞
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务