/** * 注: > 第一次进入事务流程 newTransaction 值为 true * > requires_new 类型传播属性 newTransaction true * * (1) 结果获取到 DefaultTransactionStatus * (2) 判断事务存在事务不存在则直接创建事务 * (2.1) doBegin() 方法 * a. 从数据源对象中获取 数据库连接Connection(jdk) 封装成 ConnectionHolder(spring) * b. 获取到连接后是否开启自动提交 开启了就关闭自动提交 * c. 激活事务状态 transactionStatus 设置为 true * d. 超时验证 * e. 两层绑定 * (1) dataSource[数据源] -> connectionHolder 关系绑定 * (2) map 关系 设置到NamedThreadLocal对象 与当前线程进行绑定 * (3) 存在事务 需要考虑两种特殊的 事务传播属性 * never / not_support / required / requires_new / nested * <3.1> not_support 不支持事务 当前事务会挂起不走事务 * <3.2> requires_new / nested 两种传播属性需要特殊注意 * a. requires_new 新建事务并将当前事务挂起 * 挂起: (1) 将事务对象的 连接置空 null * (2) 数据库连接 和 事务的连接对象解绑同时从 ThreadLocal 中移除,并返回旧的连接对象 * (3) 将旧的连接对象 设置到新的DefaultTransactionStatus对象以便于恢复旧的事务 * (4) 挂起完成后 创建新的事务 重新执行 2.1 步骤 * 获取连接/关闭自动提交/激活事务/超时验证/绑定新的关系 * b. nested 嵌套事务 支持当前事务,通过创建savePoint, 与当前事务共用同一连接对象 * DefaultTransactionStatus.createSavepoint() * 创建savepoint_0 保存点nest 每执行一次 生成一个 savepoint按调用方法的层次同一线程需要递增 */
重温-Spring事务核心类-TransactionInterceptor TransactionAspectSupport
最新推荐文章于 2022-06-19 17:52:07 发布