簡體   English   中英

Spring Transaction (@Transaction) with Plain JDBC without JdbcTemplate

[英]Spring Transaction (@Transaction) with Plain JDBC without JdbcTemplate

我有使用連接接口進行事務管理的普通 JDBC 代碼。 我想小步切換到 Spring 事務管理。

首先,我想為我的數據源提供PlatformTransactionManager並使用 @Transaction 注釋我的類/方法並保持我的其他邏輯相同,即。 使用連接/ PreparedStatement 等。

我看到的所有示例都使用 JdbcTemplate。 我想知道可以在沒有 JdbcTemplate 的情況下使用 Spring Transaction 嗎?

從技術上講,可以在沒有JdbcTemplate情況下使用@Transactional 但是,如果您嘗試這樣做,您遲早會發現您正在重新發明JdbcTemplate已經完成的事情。

@Transactional所做的是在執行@Transactional方法之前,它會幫助您從DataSource獲取一個 JDBC Connection ,並在此Connection上啟動一個事務。然后 JDBC Connection將存儲在ThreadLocal

這意味着如果您在沒有JdbcTemplate情況下執行此操作,則必須從該ThreadLocal手動獲取此Connection ,以便您可以從中創建一個 JDBC Statement來執行您的 SQL。 更不用說您必須自己手動正確釋放 JDBC 資源,例如StatementResultSet等,所有這些都已由JdbcTemplate

但是,如果您已經手動實現了這些 JDBC 代碼並且只想讓@Transactional來處理事務,您可以嘗試將DataSource注入到您的 bean 中,然后使用以下方法獲取您的 JDBC 代碼使用的Connection

    Connection connection = DataSourceUtils.getConnection(dataSource);

還可以查看JdbcTemplate#execute(ConnectionCallback<T> action) ,它對於將需要 JDBC Connection工作的現有 JDBC 代碼遷移到JdbcTemplate很有用。

是的,這是可能的。 向您的方法添加@Transactional注釋,只要它們遵循正確的程序就應該使您的方法具有事務性。 但正如其他人所提到的,如果您正在更新應用程序,您最好放棄普通 JDBC 並遷移到 Spring JPA/JDBC(取決於您使用的 Spring 版本)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM