痛点
- 手动提交事务需要写begin,commit的重复代码,可不可以在业务方法开始时程序自动调用begin,结束后自动调用commit,最好报异常自动回滚。
- 事务嵌套怎么搞,事务嵌套中使用不同的资源策略,回滚策略
设计
事务管理器TransactionManager
他有三个核心的功能接口
- 获取事务资源,资源是任意的,可能来自jdbc connection/hibernate mybatis session
- 提交事务
- 回滚事务
事务定义transactionDefinition
定义当前方法的隔离级别
事务资源同步器TransactionSynchronizationManager
用来获取资源和区分传播行为
事务状态TransactionStatus
用来存储上一个被挂起的事务
流程
获取到连接资源后,判断如果有事务,没事务、不用事务应该如何处理
public final TransactionStatus getTransaction(TransactionDefinition definition) {
//创建事务资源 - 比如 Connection
Object transaction = doGetTransaction();
if (isExistingTransaction(transaction)) {
// 处理当前已有事务的场景
return handleExistingTransaction(def, transaction, debugEnabled);
}else if (def.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRED ||
def.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRES_NEW ||
def.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NESTED){
// 开启新事务
return startTransaction(def, transaction, debugEnabled, suspendedResources);
}else {
// 彻底不用事务
}
// ...
}
当前有事务,根据不同传播行为处理不同。这个稍微有些麻烦,因为子方法有独立事务的需求,可是事务同步管理器只能存一个事务资源。所以新开启的事务记录上一个事务。连接成一个链表
jvm监控调优 mysql锁 springcloud 分库分表 k8s tomcat调优