- 事务开始先记录到日志文件
- 提交事务才会永久保存到数据库
- 回滚,清空数据库
数据库并发访问冲突问题
脏读
读取到其他事务未提交的数据。
不可重复读
- 重复读取同一数据时,与之前读取的数据不一致。
- 一个事务提交的数据,可以被另一个事务立即读取。
幻读
- 读取到已经被删除的数据。
- 读取不到新插入的数据。
什么是分布式事务?
在微服务系统中,每个微服务应用都可能会有自己的数据库,它们首先需要控制自己的本地事务。
什么Seata?
分布式事务开源的解决方案,提高性能和简单易用的分布式事务服务,Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
Seata AT事务方案
- 无侵入的分布式事务解决方案全局事务
第一阶段: 执行各分支事务
第二阶段: 控制全局事务最终提交或回滚
Tc事务协调器
协调各个服务的事务运行状态,使各个服务相互感知事务是否成功
TM(Transaction Manager,事务管理器
- TM 向 TC 申请开启一个全局事务:
- TC会产生一个全局事务ID,称为 XID,并将 XID 传回 TM,开启事务
- 全部分支事务成功后,向TC发送全局事务的提交请求
-
TC 会向所有 RM 发送提交操作指令,RM 会完成最终提交操作:
-
TM 会进行决策,确定全局事务失败,向 TC 发送全局事务的回滚请求
-
TC 会向所有 RM 发送回滚操作指令,RM 会完成最终回滚操作
RM(Resource Manager,资源管理器
RM 负责对分支事务(即微服务的本地事务)进行管理,并与 TC 通信,上报分支事务的执行状态、接收全局事务的提交或回滚指令。
- 开启事务后,保存业务后,会启动RM ,并将XID传递给RM
- RM 首先会使用 XID 向 TC 注册分支事务,将分支事务纳入对应的全局事务管辖。
- 保存业务的分支事务,成功,RM上报事务
- TC 收到后,会将该状态信息传递到 TM:
Seata 支持多款注册中心服务:nacos 、eureka、redis、zk、consul、etcd3、sofa。
@ConfigurationProperties(prefix = "spring.datasource")为当前注入的bean对象读取配置文件以spring.datasource开头的配置项,如果之后的部分和实体类的属性一致的话,会将配置的内容注入给对象的属性中
TCC 基本原理
区别:
- TCC 对业务代码侵入严重,数据操作要进行编码来实现,事务无法自动处理
- TCC 效率更高,允许多个事务同时操作数据。不用加全局锁
上下文对象
BusinessActionContext 上下文对象,用来在两个阶段之间传递数据
@BusinessActionContextParameter 注解的参数数据会被存入 BusinessActionContext
@TwoPhaseBusinessAction(name = "orderTccAction", commitMethod = "commit", rollbackMethod = "rollback")//表示第二阶段的方法名
保存标识:ResultHolder提供第二阶段判断
@localTCC提交tcc事务