# 第11节:声明事务领取活动领域开发
作者:小傅哥
博客:https://bugstack.cn (opens new window)
沉淀、分享、成长,让自己和他人都能有所收获!
- 应用分支:211001_xfg_ActivityPartake (opens new window)
- 路由组件:db-router-spring-boot-starter#211001_xfg_TransactionTemplate
新增硬编码路由,用于支撑声明式事务使用
(opens new window) - 描述:扩展自研数据库路由组件,支持声明式事务处理。用于领取活动领域功能开发中用户领取活动信息,在一个事务下记录多张表数据。
# 零、优秀作业
- 声明事务领取活动领域开发 @一点江南 (opens new window)
- 声明事务领取活动领域开发 @BerserkD (opens new window)
- 模板模式的核心就是通过抽象类定义抽象方法的执行顺序 @知行人 (opens new window)
- 事务控制_领取活动领域开发 @Geroge Liu (opens new window)
- 声明事务领域、活动领域开发(完成第8节partake部分服务)@liuc (opens new window)
- 同一个事务下,连续操作不同的DAO操作,那么就会涉及到在 DAO 上使用注解 @DBRouter(key = "uId") 反复切换路由的操作。虽然都是一个数据源,但这样切换后,为什么事务就没法处理了? @眼镜 (opens new window)
- 业务接口 + 模板抽象类 + 数据支撑类 + 抽象方法实现类,职责明确 @AD钙奶 (opens new window)
- 项目过程中遇到的bug以及经验总结 @锚 (opens new window)
- 什么是编程式事务?@星期一 (opens new window)
- 编程式事务,transactionTemplate.execute(status -> {}),代码控制回滚status.setRollbackOnly(); @learningJ (opens new window)
- 整体结构比较简单,即使用了模板方法,定义了活动领取流程,难点在于细节 @错否 (opens new window)
- Spring声明式事务引起的路由失效分析 @布丁 (opens new window)
# 一、开发日志
- db-router-spring-boot-starter 扩展和完善自研简单版数据库路由组件,拆解路由策略满足声明式路由配合声明式事务一起使用。
- 补全库表 activity 增加字段 strategy_id 运行本章节记得更新此分支下最新 SQL 语句。抽奖策略ID字段 strategy_id 用于关联活动与抽奖系统的关系。也就是用户领取完活动后,可以通过活动表中的抽奖策略ID继续执行抽奖操作
- 基于模板模式开发领取活动领域,因为在领取活动中需要进行活动的日期、库存、状态等校验,并处理扣减库存、添加用户领取信息、封装结果等一系列流程操作,因此使用抽象类定义模板模式更为妥当
# 二、自研组件(DBRouter) - 扩展声明式事务
- 问题:如果一个场景需要在同一个事务下,连续操作不同的DAO操作,那么就会涉及到在 DAO 上使用注解 @DBRouter(key = "uId") 反复切换路由的操作。虽然都是一个数据源,但这样切换后,事务就没法处理了。
- 解决:这里选择了一个较低的成本的解决方案,就是把数据源的切换放在事务处理前,而事务操作也通过声明式编码进行处理。具体可以参考 db-router-spring-boot-starter 源码
# 1. 拆解路由算法策略,单独提供路由方法
public interface IDBRouterStrategy {
void doRouter(String dbKeyAttr);
void clear();
}
1
2
3
4
5
6
7
2
3
4
5
6
7
- 把路由算法拆解出来,无论是切面中还是硬编码,都通过这个方法进行计算路由