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 资源,如 StatementResultSet 等,所有这些事情都已经由 JdbcTemplate.

但是如果您已经手动实现了这些 JDBC 代码并且只想让 @Transactional 处理事务,您可以尝试将 DataSource 注入到您的 bean 中,然后使用以下方法为您的 JDBC 代码获取 Connection 使用:

    Connection connection = DataSourceUtils.getConnection(dataSource);

另外检查 JdbcTemplate#execute(ConnectionCallback<T> action) ,它对于迁移现有的 JDBC 代码很有用 JDBC Connection 可以继续工作到 JdbcTemplate.