這篇文章詳細分析了在Spring Boot或Spring Data JPA中預設使用的RESOURCE_LOCAL事務型別是如何工作的。
文章首先介紹了JPA事務型別的背景,提到JPA 1.0規範釋出時有兩種事務型別:JTA(Java Transaction API)和RESOURCE_LOCAL。JTA允許跨多個資料庫連線、快取或JMS佇列進行全域性事務管理。使用JTA時,需要在persistence.xml檔案中進行特定的配置。
如果不需要全域性事務,JPA提供了RESOURCE_LOCAL事務型別,它可以使用單個資料庫連線進行操作。選擇這種事務模式時,需要將transaction-type屬性設定為RESOURCE_LOCAL,並使用指向JDBC DataSource的non-jta-data-source元素。
使用RESOURCE_LOCAL事務型別時,JDBC Connection如何管理底層資料庫事務?
- 預設情況下,JDBC Connection使用自動提交模式,JPA提供者會禁用它(如果之前沒有被禁用)。
- 資料庫連線繫結到當前執行的執行緒,並用於所有語句執行,直到事務結束。
在工作單元結束時,如果沒有檢測到失敗,將呼叫關聯JDBC Connection上的commit方法,資料庫事務也將被提交。如果檢測到失敗,則呼叫rollback方法。
使用RESOURCE_LOCAL事務型別時,資料庫事務由底層JDBC Connection管理。
在Spring中,TransactionInterceptor將呼叫底層TransactionManager的commit或rollback。
- 對於RESOURCE_LOCAL事務型別,Spring提供了JpaTransactionManager,
- 而對於JTA,則必須使用JtaTransactionManager。
詳細點選標題