Spring 使用普通 JDBC 没有 JdbcTemplate 的事务 (@Transaction)
Spring Transaction (@Transaction) with Plain JDBC without JdbcTemplate
我有普通的 JDBC 代码,它使用连接接口进行事务管理。我想逐步切换到 Spring 事务管理。
首先,我想为我的数据源提供 PlatformTransactionManager
并使用 @Transaction 注释我的 class / 方法,并保持我的其他逻辑相同,即。使用连接/ PreparedStatement 等
我看到的所有示例都使用 JdbcTemplate。我想知道 Spring Transaction 可以在没有 JdbcTemplate 的情况下使用吗?
是的,这是可能的。向您的方法添加 @Transactional
注释,as long as they follow the correct procedure 应该 使您的方法具有事务性。但是正如其他人提到的那样,如果您正在更新您的应用程序,您不妨放弃普通的 JDBC 并转到 Spring JPA/JDBC(取决于 [=18 的哪个版本=] 你正在使用)。
从技术上讲,可以在不使用 JdbcTemplate
的情况下使用 @Transactional
。但是,如果您尝试这样做,您迟早会发现您正在重新发明 JdbcTemplate
.
已经完成的事情
@Transactional
的作用是在执行@Transactional
方法之前,它会帮助你从DataSource
得到一个JDBCConnection
,并且在此 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 代码很有用 JDBC Connection
可以继续工作到 JdbcTemplate
.
我有普通的 JDBC 代码,它使用连接接口进行事务管理。我想逐步切换到 Spring 事务管理。
首先,我想为我的数据源提供 PlatformTransactionManager
并使用 @Transaction 注释我的 class / 方法,并保持我的其他逻辑相同,即。使用连接/ PreparedStatement 等
我看到的所有示例都使用 JdbcTemplate。我想知道 Spring Transaction 可以在没有 JdbcTemplate 的情况下使用吗?
是的,这是可能的。向您的方法添加 @Transactional
注释,as long as they follow the correct procedure 应该 使您的方法具有事务性。但是正如其他人提到的那样,如果您正在更新您的应用程序,您不妨放弃普通的 JDBC 并转到 Spring JPA/JDBC(取决于 [=18 的哪个版本=] 你正在使用)。
从技术上讲,可以在不使用 JdbcTemplate
的情况下使用 @Transactional
。但是,如果您尝试这样做,您迟早会发现您正在重新发明 JdbcTemplate
.
@Transactional
的作用是在执行@Transactional
方法之前,它会帮助你从DataSource
得到一个JDBCConnection
,并且在此 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 代码很有用 JDBC Connection
可以继续工作到 JdbcTemplate
.