Skip to content

Latest commit

 

History

History
38 lines (26 loc) · 2.35 KB

MySQL事务.md

File metadata and controls

38 lines (26 loc) · 2.35 KB

MySQL 事务

  • ACID

    • 原子性(atomicity):一个事务必须被视为一个不可分割的最小工作单元
    • 一致性(consistency):数据库总是从一个一致性的状态转换到另一个一致性的状态
    • 隔离性(isolation):一个事务所做的修改在最终提交前,对其他事务都是不可见的
    • 持久性(durability):一旦事务提交,则其所做的修改就会永久保存到数据库中(记录一个昨天看到的:MySQL对数据库的操作,只是修改其内存拷贝,然后将修改行为记录持久在硬盘上的事务日志-(采用追加的形式)中,然后在后台慢慢地刷回到磁盘中)
  • 在事务中使用混合引擎

    例如:在事务中混合使用事务型引擎(InnoDB)的表和非事务型引擎(MyISAM)的表

    会出现的问题:当事务需要回滚的时候,使用非事务引擎的表的数据无法回滚

  • InnoDB 上锁

    • 隐式锁定:只有在COMMIT和ROLLBACK的时候才会释放,常用的一般都是属于这一类型
    • 显式锁定:不属于SQL规范
      • SELECT ... LOCK IN SHARE MODE
      • SELECT ... FOR UPDATE
    • MySQL还支持 LOCK TABLES 和 UNLOCK TABLES(跟引擎无关,在服务器层实现)(会导致变复杂。一般不推荐使用)
  • MVCC 多版本并发控制(只在 REPEATABLE READ 和 READ COMMITTED 两个隔离级别下工作)

    • 例子:InnoDB 的 MVCC 【保存两个额外系统版本号,使大部分的读操作不需要加锁-使读数据的操作变得简单并且性能消耗较小】
      • SELECT【只有符合下面两个条件的结果才会被返回】
        • InnoDB只查找版本早于当前事务版本的数据行【这样确保了 这些行要么在事务开始之前就已经存在,或者在事务进行的过程中插入或者修改的】
        • 行的删除版本要么未定义,要么大于当前事务的版本号【这样确保了事务读取到的行,在事务开始之前未被删除】
      • INSERT
        • InnoDB 为新插入的每一行保存当前系统版本号作为行版本号
      • DELETE
        • InnoDB 为删除的每一行保存当前系统版本号作为行删除标志
      • UPDATE
        • InnoDB 为插入一行新纪录,保存当前系统版本号作为行版本号,同时保存当前系统版本号到原来的行作为行删除标志