创建微网站,北京死亡病例最新消息,wordpress主题 ality,做网站怎么签订协议Spring 将 JDBC 的 Connection、Hibernate 的 Session 等访问数据库的连接或者会话对象统称为资源#xff0c;这些资源在同一时刻是不能多线程共享的 。 为了让 DAO 或 Service 类可以实现单例模式#xff0c; Spring 的事务同步管理类 org.springframework.transaction.supp… Spring 将 JDBC 的 Connection、Hibernate 的 Session 等访问数据库的连接或者会话对象统称为资源这些资源在同一时刻是不能多线程共享的 。 为了让 DAO 或 Service 类可以实现单例模式 Spring 的事务同步管理类 org.springframework.transaction.support.TransactionSynchronizationManager 利用 ThreadLocal 为不同的事务线程提供了独立的资源副本并同时维护这些事务的配置属性和运行状态信息 。 Spring 框架为不同的持久化技术提供了一套从 TransactionSynchronizationManager 中获取对应线程绑定资源的工具类这些工具类都提供了可以获取绑定当前线程资源的静态方法 持久化技术线程绑定资源获取工具静态方法Spring JDBC 或 MyBatisorg.springframework.jdbc.datasource.DataSourceUtilspublic static Connection getConnection(DataSource dataSource)HibernateX.0org.springframework.orm.hibernateC.SessionFactoryUtilspublic static Session getSession(SessionFactory sessionFactory, boolean allowCreate)JPAorg.springframework.orm.jpa.EntityManagerFactoryUtilspublic static EntityManager getTransactionalEntityManager(EntityManagerFactory emf)JDOorg.springframework.orm.jdo.PersistenceManagerFactoryUtilspublic static PersistenceManager getPersistenceManager(PersistenceManagerFactory pmf, boolean allowCreate)某些场景下可能无法使用 Spring 提供的模板类。这时就必须通过操作底层持久化技术所提供的原生 API 而这就需要通过这些工具类来获取线程绑定的资源。如果直接从 DataSource 或 SessionFactory 中获取资源那么就无法让数据操作参与到与本线程相关的事务环境因为这些对象不能获取和当前线程相关的资源。 TransactionSynchronizationManager 源码如下 public abstract class TransactionSynchronizationManager {private static final Log logger  LogFactory.getLog(TransactionSynchronizationManager.class);private static final ThreadLocalMapObject, Object resources new NamedThreadLocalMapObject, Object(Transactional resources);private static final ThreadLocalSetTransactionSynchronization synchronizations new NamedThreadLocalSetTransactionSynchronization(Transaction synchronizations);private static final ThreadLocalString currentTransactionName new NamedThreadLocalString(Current transaction name);private static final ThreadLocalBoolean currentTransactionReadOnly new NamedThreadLocalBoolean(Current transaction read-only status);private static final ThreadLocalInteger currentTransactionIsolationLevel new NamedThreadLocalInteger(Current transaction isolation level);private static final ThreadLocalBoolean actualTransactionActive new NamedThreadLocalBoolean(Actual transaction active);...
}
复制代码事务线程成员变量说明resourcesConnection 或 Session 等资源currentTransactionName事务名称currentTransactionReadOnly事务只读状态currentTransactionIsolationLevel事务隔离级别actualTransactionActive事务激活状态TransactionSynchronizationManager 将 Dao、Service 类中影响线程安全的所有 “ 状态 ” 都统一抽取到该类中并用 ThreadLocal 进行封装这样一来 Dao 基于模板类或资源获取工具类创建的 Dao 和 Service 采用 Spring 事务管理机制就变成线程安全的对象啦 O(∩_∩)O~ 转载于:https://juejin.im/post/5c97117d5188252d59100dac