Spring 将 JDBC 的 Connection、Hibernate 的 Session 等访问数据库的连接或者会话对象统称为资源,这些资源在同一时刻是不能多线程共享的 。 为了让 DAO 或 Service 类可以实现单例模式, Spring 的事务同步管理类 org.springframework.transaction.support.TransactionSynchronizationManager 利用 ThreadLocal 为不同的事务线程提供了独立的资源副本,并同时维护这些事务的配置属性和运行状态信息 。

Spring 框架为不同的持久化技术提供了一套从 TransactionSynchronizationManager 中获取对应线程绑定资源的工具类,这些工具类都提供了可以获取绑定当前线程资源的静态方法:

持久化技术 线程绑定资源获取工具 静态方法
Spring JDBC 或 MyBatis org.springframework.jdbc.datasource.DataSourceUtils public static Connection getConnection(DataSource dataSource)
HibernateX.0 org.springframework.orm.hibernateC.SessionFactoryUtils public static Session getSession(SessionFactory sessionFactory, boolean allowCreate)
JPA org.springframework.orm.jpa.EntityManagerFactoryUtils public static EntityManager getTransactionalEntityManager(EntityManagerFactory emf)
JDO org.springframework.orm.jdo.PersistenceManagerFactoryUtils public 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 ThreadLocal<Map<Object, Object>> resources =new NamedThreadLocal<Map<Object, Object>>("Transactional resources");private static final ThreadLocal<Set<TransactionSynchronization>> synchronizations =new NamedThreadLocal<Set<TransactionSynchronization>>("Transaction synchronizations");private static final ThreadLocal<String> currentTransactionName =new NamedThreadLocal<String>("Current transaction name");private static final ThreadLocal<Boolean> currentTransactionReadOnly =new NamedThreadLocal<Boolean>("Current transaction read-only status");private static final ThreadLocal<Integer> currentTransactionIsolationLevel =new NamedThreadLocal<Integer>("Current transaction isolation level");private static final ThreadLocal<Boolean> actualTransactionActive =new NamedThreadLocal<Boolean>("Actual transaction active");...
}
复制代码
事务线程成员变量 说明
resources Connection 或 Session 等资源
currentTransactionName 事务名称
currentTransactionReadOnly 事务只读状态
currentTransactionIsolationLevel 事务隔离级别
actualTransactionActive 事务激活状态

TransactionSynchronizationManager 将 Dao、Service 类中影响线程安全的所有 “ 状态 ” 都统一抽取到该类中,并用 ThreadLocal 进行封装,这样一来, Dao (基于模板类或资源获取工具类创建的 Dao )和 Service (采用 Spring 事务管理机制)就变成线程安全的对象啦 O(∩_∩)O~

转载于:https://juejin.im/post/5c97117d5188252d59100dac

说说 Spring 的事务同步管理器相关推荐

  1. seata分布式事务协调管理器是如何实现的

    本文来说下seata分布式事务协调管理器是如何实现的 文章目录 概述 概述

  2. 无线音乐同步管理器:Airfoil for mac

    Airfoil for mac是Mac平台上一款优秀的音乐播放器和音频传输工具!airfoil mac可以将Spotify等音乐服务或Pandora等基于网络的音频无线发送到各种设备,包括Apple ...

  3. EtherCAT理论学习笔记【三】——WKC和SM同步管理器

    文章目录 前言 一.WKC码 1.简介 2.案例 二.SyncManger 1.简介 2.案例分析 前言 详细的理论分析和案例讲解,帮助理解WKC码和SyncManager. 一.WKC码 1.简介 ...

  4. Spring Cache抽象-缓存管理器

    概述 SimpleCacheManager NoOpCacheManager ConcurrentMapCacheManager CompositeCacheManager 概述 CacheManag ...

  5. java缓存管理器_使用@EnableCaching的Spring Boot默认缓存管理器

    我在SpringBootApplication中实现了缓存,如下所示 @SpringBootApplication @EnableCaching public class SampleApplicat ...

  6. Airfoil for mac(无线音乐同步管理器)

    Airfoil mac版是Mac平台上一款优秀的音乐播放器和音频传输工具!主要是通过无线的方式将音乐传到其他的设备,能播放出高品质的音乐. airfoil mac版功能介绍 任何音频,无处不在 在您的 ...

  7. Spring AOP事务实现原理之事务管理器TransactionManager

    流程图 该图介绍了事务的传播行为 该流通图展示的是TransactionManager具体如何结合事务的传播行为进行事务获取 该流通图展示的是TransactionManager具体如何结合事务的传播 ...

  8. spring(三)之事务、事务管理器(TransactionManager)简介及实现事务的4种方式

    1.事务 一组业务ACID操作,要么全部成功,要么全部不成功. 事务特性:①原子性,针对整体而言(一个事务不可以被拆分):②一致性,针对数据而言(一个事务执行之前和执行之后必须处于一致性状态,一个事务 ...

  9. Spring事务专题(四)Spring中事务的使用、抽象机制及模拟Spring事务实现

    前言 本专题大纲如下: 事务专题大纲 「对于专题大纲我又做了调整哈,主要是希望专题的内容能够更丰富,更加详细」,本来是想在源码分析的文章中附带讲一讲事务使用中的问题,这两天想了想还是单独写一篇并作为事 ...

最新文章

  1. win8安装msi出现提示2503 2502的错误代码
  2. Python 生成器与列表解析
  3. [转]国际化: 理解Java平台上的Locale
  4. Beta 冲刺 (4/7)
  5. Rancher助力美国农业部的容器实践之路
  6. phpstudy配置oracle,phpStudy配置sql、oracle---博主摘录
  7. idea—开启Run DashBoard
  8. python 全栈开发,Day81(博客系统个人主页,文章详情页)
  9. Android SEAndroid
  10. 【cluvfy】集群验证工具cluvfy使用方法——stage
  11. 职场:因抢一个月饼,惨遭阿里开除,如今他把生活过成这样
  12. FDD LTE B1是什么
  13. VISUAL STUDIO INSTALLER下载速度过慢的解决办法
  14. 什么是服务器虚拟化,虚拟化的优势!
  15. 个性测试:跟乐嘉学性格色彩(图)
  16. java读取配置文件详解
  17. 知云文献翻译 for mac
  18. CPython、Jython、PyPy
  19. Tomcat 配置集锦
  20. python输入数学表达式并求值_用Python3实现表达式求值

热门文章

  1. websphere jndi oracle,websphere7.0获得JNDI连接报invalid username/password
  2. mongodb备份oplog_MongoDB 备份(mongodump)与恢复(mongorestore)
  3. python棋盘最短路径_【leetcode】64. Minimum Path Sum 棋盘最短路径
  4. html meta页面自适应,【转载·收藏】 html5手机网站自适应需要加的meta标签
  5. 获取input相同名字的元素的值
  6. Uva 1625 - Color Length(DP)
  7. BZOJ1922 SDOI2010 大陆争霸 最短路
  8. SQL数据库。按年,月,日查询
  9. 基于Angularjs实现分页
  10. c语言link错误什么原因,C语言 OpenCV错误:“LINK:致命错误LNK1104:无法打开文件’opencv_core231d.lib’”...