大家好,欢迎来到IT知识分享网。
Seata 四种事务模式的实现方式及代码示例
Seata 提供了四种事务模式:AT、TCC、SAGA 和 XA。每种模式都有其独特的实现方式和适用场景。以下是每种模式的详细说明及代码示例。
1. AT 模式
实现方式:
- AT 模式是 Seata 的默认模式,基于本地 ACID 事务的关系型数据库,通过两阶段提交协议实现分布式事务的一致性。
- 一阶段:TM 开启全局事务并调用分支事务,RM 注册分支事务,直接执行 SQL 并提交,记录 undo-log 快照。
- 二阶段:TM 提交或回滚全局事务,若成功,则直接删除 undo-log,若失败,则根据 undo-log 快照回滚,然后删除 undo-log 快照。
代码示例:
import io.seata.spring.annotation.GlobalTransactional; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class BusinessService { @Autowired private OrderService orderService; @Autowired private StorageService storageService; @GlobalTransactional(name = "example-dtx-group", rollbackFor = Exception.class) public void purchase(String userId, String commodityCode, int orderCount) { // 扣减库存 storageService.deduct(commodityCode, orderCount); // 创建订单 orderService.create(userId, commodityCode, orderCount); } }
2. TCC 模式
实现方式:
- TCC 模式将事务分解为 Try、Confirm 和 Cancel 三个阶段。
- Try 阶段:预留资源,检查资源是否足够。
- Confirm 阶段:确认操作,正式执行业务逻辑。
- Cancel 阶段:取消操作,释放预留资源。
代码示例:
import io.seata.rm.tcc.api.BusinessActionContext; import io.seata.rm.tcc.api.BusinessActionContextParameter; import io.seata.rm.tcc.api.LocalTCC; import io.seata.rm.tcc.api.TwoPhaseBusinessAction; import org.springframework.stereotype.Service; @Service @LocalTCC public class TccService { @TwoPhaseBusinessAction(name = "deductInventory", commitMethod = "confirmDeductInventory", rollbackMethod = "cancelDeductInventory") public boolean tryDeductInventory(BusinessActionContext context, @BusinessActionContextParameter(paramName = "commodityCode") String commodityCode, @BusinessActionContextParameter(paramName = "orderCount") int orderCount) { // 预留库存 return true; } public boolean confirmDeductInventory(BusinessActionContext context) { // 确认扣减库存 return true; } public boolean cancelDeductInventory(BusinessActionContext context) { // 取消扣减库存 return true; } }
3. SAGA 模式
实现方式:
- SAGA 模式将长时间、复杂的事务分解为多个小的、可逆的事务片段。
- 正向操作:执行业务逻辑。
- 补偿操作:当某个正向操作失败时,执行前面参与者的逆向回滚操作,回滚已提交的参与者,使分布式事务回到初始状态。
代码示例:
import io.seata.saga.engine.StateMachineEngine; import io.seata.saga.proctrl.ProcessContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class SagaService { @Autowired private StateMachineEngine stateMachineEngine; public void startSaga() { ProcessContext context = new ProcessContext(); // 设置业务参数 context.setVariable("param1", "value1"); context.setVariable("param2", "value2"); // 启动 Saga 流程 stateMachineEngine.startWithBusinessKey("saga-demo", "saga-demo", context); } }
4. XA 模式
实现方式:
- XA 模式使用两阶段提交协议保证事务的一致性和可靠性。
- 一阶段:TM 开启全局事务,RM 注册分支事务,RM 执行 SQL 但不提交,RM 将执行状态报告给 TC。
- 二阶段:TM 提交全局事务,TC 统计各分支状态,如果都成功,则通知 RM 提交。如果失败,则通知 RM 回滚。
代码示例:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service public class XaService { @Autowired private JdbcTemplate jdbcTemplate; @Transactional public void transfer(String fromAccount, String toAccount, double amount) { // 扣减源账户余额 jdbcTemplate.update("UPDATE account SET balance = balance - ? WHERE account_id = ?", amount, fromAccount); // 增加目标账户余额 jdbcTemplate.update("UPDATE account SET balance = balance + ? WHERE account_id = ?", amount, toAccount); } }
总结
- AT 模式:适用于不希望对业务进行改造的场景,几乎0学习成本。
- TCC 模式:适用于核心系统等对性能有很高要求的场景。
- SAGA 模式:适用于业务流程长且需要保证事务最终一致性的业务系统。
- XA 模式:适用于并发量不大的重要数据,提供强一致性但牺牲可用性。
每种模式都有其适用场景,选择合适的模式可以更好地解决分布式事务问题。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/181484.html