日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

说说 Spring 的事务同步管理器

發布時間:2023/12/9 javascript 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 说说 Spring 的事务同步管理器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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 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");... } 復制代碼事務線程成員變量說明
resourcesConnection 或 Session 等資源
currentTransactionName事務名稱
currentTransactionReadOnly事務只讀狀態
currentTransactionIsolationLevel事務隔離級別
actualTransactionActive事務激活狀態

TransactionSynchronizationManager 將 Dao、Service 類中影響線程安全的所有 “ 狀態 ” 都統一抽取到該類中,并用 ThreadLocal 進行封裝,這樣一來, Dao (基于模板類或資源獲取工具類創建的 Dao )和 Service (采用 Spring 事務管理機制)就變成線程安全的對象啦 O(∩_∩)O~

轉載于:https://juejin.im/post/5c97117d5188252d59100dac

總結

以上是生活随笔為你收集整理的说说 Spring 的事务同步管理器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。