[英]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 資源,例如Statement
, ResultSet
等,所有這些都已由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.