注意: 事物是一个很大的话题, 在沟通的时候, 可以先说明事物范围, 以免造成沟通不畅
事物分为
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.编写补偿逻辑(发线上报警, 人工补偿)
3.如何实现隔离性(Isolation)?
- MVCC引擎(多版本并发控制)
4.如何实现持久性(Durability)?
-
WAL预写日志机制 - redo log(物理文件修改日志,增量的)
通常是物理日志,记录的是数据页的物理修改,而不是某一行或某几行修改成怎样怎样, 它用来恢复提交后的物理数据页(恢复数据页,且只能恢复到最后一次提交的位置)。
-
WAL预写日志机制 - undo log(回滚点)
用来回滚行记录到某个版本。undo log一般是逻辑日志,根据每行记录进行记录。
-
写日志的优化方式
1.顺序写日志, 注: 顺序写可以减少硬盘的寻址时间 2.批量写 0定时调用fsync, 1事物结束调用fsync, 2事物结束调用write