1. 程式人生 > >JDBC事務與ORM事務管理的差異與聯絡

JDBC事務與ORM事務管理的差異與聯絡

1. JDBC需要事務嗎?

習慣裡Spring JdbcTemplate的便捷性,一直以為JDBC不需要事務,但是仔細一想,如果有多條SQL語句同時執行,如何保證事務的完整性?

仔細閱讀JdbcTemplate的原始碼,發現底層實現都依賴於DataSourceUtils,而它在獲取資料連線時,是依賴於事務管理器的,如下:

public static boolean isConnectionTransactional(Connection con, DataSource dataSource) {
    if (dataSource == null) {
        return
false; } ConnectionHolder conHolder = (ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource); return (conHolder != null && connectionEquals(conHolder, con)); }

且在Spring JDBC的使用中,官方推薦採用DataSourceTransactionManager,如下:

<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
>
<property name="dataSource" ref="dataSource"/> </bean>

依舊支援宣告式事務與程式設計式事務,在JDBC中,除了提交SQL與回滾SQL,事務的用途主要表現以下二方面:
1. 同步資料庫連線的獲取;
2. 封裝異常並形成異常棧;

如果沒有為JDBC配置事務,預設情況下,Spring會自動建立事務管理器(請參見DBUtil類),並且在沒有事務管理的情況下,Spring JDBC將無法獲取資料庫連線。

所以,在大多數情況下,從感覺上來看,JDBC操作即使沒有事務,依舊能正常進行資料庫操作。

2. ORM事務的用途

在ORM框架中,最重要、最強大的物件當然是Session,當然也正因為有它,才更需要強大的事務管理,跟JDBC相比,ORM事務除了需要具有JDBC的功能,還需要管理快取物件(一級Session獨享快取,二級共享物件快取以及查詢快取),更重要的是,事務還與Session密切相關,一個事務只能屬於一個唯一的Session。

所以,與JDBC事務不同的是,ORM框架必須配置事務,所有的操作都必須在事務開啟的情況下進行,即便是讀取操作(沒有事務的話,懶載入的資料必定失敗)。

3. 一個應用程式支援多個事務管理器嗎?

顯然,一個應用程式可以多個事務管理器,以AOP的觀點來看,多個事務管理器混合使用時,事務必然會形成巢狀關係(環繞切面),所以最外層的事務收到的影響最多,並且通過合適的配置,最外層的事務失敗也能影響到內層的事務。

4. JDBC的事務會影響到ORM的事務嗎?

每個事務都有自己獨立的上下文,所以基本上不會影響,但是我們剛剛說到,ORM框架會管理快取,如果JDBC操作了ORM物件,可能會導致低效的快取管理。

總結

事務管理器的作用主要體現在如下兩方面:
1. 提交事務;
2. 回滾事務;
如果JDBC操作不配置事務,那麼有可能導致獲取資料庫連線失敗,並且不能享受到增強的異常棧,但依舊能進行正常的資料庫操作,而ORM必須嚴格支援事務管理。