这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战
前言
分布式系统编程一个很大的挑战,分布式事务的一致性,ShardingJDBC也提供了一些分布式事务的解决方案。
技术选型
本地事务
在不开启任何分布式事务管理器的前提下,让每个数据节点各自管理自己的事务。单机版的我们其实也是非常熟悉的,Spring 默认的事务其实就是一个本地事务, 在分布式场景下很难保证一致性。
XA 事务
XA协议最早的分布式事务模型是由 X/Open 国际联盟提出的 X/Open Distributed Transaction Processing (DTP) 模型,简称 XA 协议。
基于XA协议实现的分布式事务对业务侵入很小。 它最大的优势就是对使用方透明,用户可以像使用本地事务一样使用基于XA协议的分布式事务。 XA协议能够严格保障事务 ACID 特性。
柔性事务
如果将实现了 ACID 的事务要素的事务称为刚性事务的话,那么基于 BASE 事务要素的事务则称为柔性事务。 BASE 是基本可用、柔性状态和最终一致性这三个要素的缩写。
- 基本可用(Basically Available)保证分布式事务参与方不一定同时在线;
- 柔性状态(Soft state)则允许系统状态更新有一定的延时,这个延时对客户来说不一定能够察觉;
- 而最终一致性(Eventually consistent)通常是通过消息传递的方式保证系统的最终一致性。
在 ACID 事务中对隔离性的要求很高,在事务执行过程中,必须将所有的资源锁定。 柔性事务的理念则是通过业务逻辑将互斥锁操作从资源层面上移至业务层面。通过放宽对强一致性要求,来换取系统吞吐量的提升。
所以在技术实现上怎么选型,具体的业务场景中具体分析,大部分的场景我们都是基于最终的一致性去做保证。分布式事务框架一定程度上减轻了开发者的工作量,但是涉及到分布式的补偿场景和应用还是非常复杂的。
实践
Sharding-JDBC下实现强一致分布式事务需要导入以下依赖:
<!--xa分布式事务-->
<dependency>
<groupId>io.shardingsphere</groupId>
<artifactId>sharding-transaction-2pc-xa</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>io.shardingsphere</groupId>
<artifactId>sharding-transaction-spring-boot-starter</artifactId>
<version>3.1.0</version>
</dependency>
@Service
public class OrderServiceImpl {
@Resource
private PaymentDAO paymentDAO;
@Resource
private CouponDAO couponDAO;
@ShardingTransactionType(TransactionType.XA)
@Transactional(rollbackFor = Exception.class)
public void pay(Long orderNo) {
paymentDAO.pay(orderNo);
couponDAO.sendCoupon(orderNo);
}
}
当然更多的案例也可以参考官方的git,基本上覆盖到了所有的ShardingJDBC应用的基本常见的场景。