数据库-事物

注意: 事物是一个很大的话题, 在沟通的时候, 可以先说明事物范围, 以免造成沟通不畅

事物分为
    1.微服务事物
    2.数据库事物

前提 ACID原则

  • 原子性(Atomicity) commit指令, rollback指令

    原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
    
  • 一致性(Consistency) 强一致,最终一致

    事务前后数据的完整性必须保持一致。
    
  • 隔离性(Isolation) MVCC引擎

    事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,
    不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
    
  • 持久性(Durability) redo日志,undo日志

    持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
    

1.如何实现原子性(Atomicity)?

  • commit指令

  • rollback指令

2.如何实现一致性(Consistency)?

  • 强一致. XA规范

      前提
          XA需要有协调者,记录全局事务ID与处理检查点。
          可以2阶段提交(2pc)或3阶段提交(3pc)
      优点: 
          使用方便
      缺点: 
          但并发度不高,因为会阻塞,提交时要等所有方ack.
        
      Mysql XA命令如下
          XA {START|BEGIN} xid [JOIN|RESUME]
            
          XA END xid [SUSPEND [FOR MIGRATE]]
            
          XA PREPARE xid
            
          XA COMMIT xid [ONE PHASE]
            
          XA ROLLBACK xid
            
          XA RECOVER [CONVERT XID]
        
        
      现有框架:
          java的JTA
            
          JTA的实现有 atomikos,seata,mycat1.x 
              mycat1.x版本基于本地文件日志与UUID实现的XA,
              mycat2.x版本基于atomikos实现的XA.
    
  • 最终一致. 1.TCC(Try,Confirm,Cancel), 2.消息队列消费重试+补偿.

      1.TCC前提:
          需要实现Try,Confirm,Cancel的代码逻辑.
            
          Try=业务逻辑,业务本身的.
          Confirm=提交改订单状态,业务本身的.
          Cancel=取消回滚,业务专门多写的代码.
        
      优点: 
          比XA并发度高, 因为不阻塞
            
      缺点: 
          入侵业务,需要自己实现补偿.
            
      现有框架: seata
          Seata AT 模式
              两阶段提交协议的演变:
              一阶段:
                  业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。
              二阶段:
                  提交异步化,非常快速地完成。
                  回滚通过一阶段的回滚日志进行反向补偿。
                
          Seata TCC 模式
              一阶段 prepare 行为:调用 自定义 的 prepare 逻辑。
              二阶段 commit 行为:调用 自定义 的 commit 逻辑。
              二阶段 rollback 行为:调用 自定义 的 rollback 逻辑。
            
          SEATA Saga 模式
              Saga模式是SEATA提供的长事务解决方案,
              在Saga模式中,业务流程中每个参与者都提交本地事务,
              当出现某一个参与者失败则补偿前面已经成功的参与者,
              一阶段正向服务和二阶段补偿服务都由业务开发实现。
        
        
      2.消息队列消费重试+补偿 (推荐使用)
            
          生产者 
              1.打开发布成功的ack机制
              2.打开消息队列持久化机制
            
          消费者
              1.打开消费成功的ack机制
              2.设置重复消费的最大次数
              3.设置重试次数用完后的补偿队列
                
          补偿者
              1.编写补偿逻辑(发线上报警, 人工补偿)
    

XA_VS_TCC

3.如何实现隔离性(Isolation)?

  • MVCC引擎(多版本并发控制)

4.如何实现持久性(Durability)?

  • WAL预写日志机制 - redo log(物理文件修改日志,增量的)

    通常是物理日志,记录的是数据页的物理修改,而不是某一行或某几行修改成怎样怎样,
    它用来恢复提交后的物理数据页(恢复数据页,且只能恢复到最后一次提交的位置)。
    
  • WAL预写日志机制 - undo log(回滚点)

    用来回滚行记录到某个版本。undo log一般是逻辑日志,根据每行记录进行记录。
    
  • 写日志的优化方式

      1.顺序写日志, 注: 顺序写可以减少硬盘的寻址时间
        
      2.批量写
          0定时调用fsync, 
          1事物结束调用fsync, 
          2事物结束调用write
    

分库分表工具集

打赏一个呗

取消

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

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

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

备案信息公示
京ICP备18003381号
京ICP备18003381号-1