Spring Transaction (@Transaction) with Plain JDBC without Jd



我有使用连接接口进行事务管理的普通JDBC代码。我想一步一步地切换到Spring事务管理。

首先,我想为我的数据源提供PlatformTransactionManager,并用@Transaction注释我的类/方法,并保持我的其他逻辑相同。使用connection/PreparedStatement等

所有的例子,我看到使用JdbcTemplate。我想知道没有JdbcTemplate可以使用Spring事务吗?

技术上可以不使用JdbcTemplate而使用@Transactional。但是如果你试着去做,你迟早会发现你是在重新发明JdbcTemplate已经做过的事情。

@Transactional的作用是,在执行@Transactional方法之前,它将帮助您从DataSource获得JDBCConnection,并在此Connection上启动事务,然后将JDBCConnection存储在ThreadLocal中。

这意味着如果你没有JdbcTemplate,你必须手动从ThreadLocal中获得这个Connection,这样你就可以创建一个JDBCStatement来执行你的SQL。更不用说你必须自己手动释放JDBC资源,如Statement,ResultSet等,所有这些事情都已经由JdbcTemplate来处理了。

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

Connection connection = DataSourceUtils.getConnection(dataSource);

还检查JdbcTemplate#execute(ConnectionCallback<T> action),它对于将期望JDBCConnection工作的现有JDBC代码迁移到JdbcTemplate是有用的。

这是可能的。在方法中添加@Transactional注释,只要它们遵循正确的过程,就应该使方法具有事务性。但是当别人提到过如果你更新你的应用程序的过程中你不妨抛弃纯JDBC和跨越Spring JPA/JDBC(取决于你使用哪个版本的Spring)。