我有使用连接接口进行事务管理的普通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)。