死磕Spring之AOP篇 - Spring 事务详解 (9)

先从当前事务管理器中获取 DataSource 对象,然后尝试以它作为一个 Key 从一个 ThreadLocal 的 Map 中获取对应的 ConnectionHolder 连接对象(没有就是 null),最终包装成一个 DataSourceTransactionObject 对象返回

// DataSourceTransactionManager.java @Override protected Object doGetTransaction() { DataSourceTransactionObject txObject = new DataSourceTransactionObject(); txObject.setSavepointAllowed(isNestedTransactionAllowed()); // 从事务同步管理器根据 DataSource 获取 Connection 连接持有者 // 就是从它的 ThreadLocal 中获取 ConnectionHolder conHolder = (ConnectionHolder) TransactionSynchronizationManager.getResource(obtainDataSource()); txObject.setConnectionHolder(conHolder, false); return txObject; } // TransactionSynchronizationManager.java /** * 事务资源,两种数据键值对 * 1. 会话工厂和会话,SqlSessionFactory -> SqlSessionHolder * 2. 数据源和连接,DataSource -> ConnectionHolder */ private static final ThreadLocal<Map<Object, Object>> resources = new NamedThreadLocal<>("Transactional resources");

如果没有 @Transactional 注解对应的元信息,则创建一个默认的 TransactionDefinition 对象

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zygsff.html