我想使用jdbcTemplate进行提交和回滚。
我的问题基于this thread
如何在jdbcTemplate上执行或回滚,如
jdbcTemplate.commit();
jdbcTemplate.rollback();
或者还有一些其他方法可以使用jdbcTemplate实现提交和回滚功能。
答案 0 :(得分:7)
要调用commit
或rollback
,将以编程方式设置事务边界,而不是以声明方式设置。
出于这个原因,你必须抓住PlatformTransactionManager - 注入你DAO中的那个并自己执行commit
/ rollback
操作。
示例代码:
@Autowired private JdbcTemplate jdbcTemplate;
@Autowired private PlatformTransactionManager platformTransactionManager;
//..
public void daoMethod(params) {
DefaultTransactionDefinition paramTransactionDefinition = new DefaultTransactionDefinition();
TransactionStatus status=platformTransactionManager.getTransaction(paramTransactionDefinition );
try{
String sqlQuery = "query";
jdbcTemplate.update(sqlQuery, params);
platformTransactionManager.commit(status);
}catch (Exception e) {
platformTransactionManager.rollback(status);
}
另一种方法是掌握TransactionTemplate
示例代码:
@Autowired private JdbcTemplate jdbcTemplate;
@Autowired private TransactionTemplate transactionTemplate;
//..
//for operations where query does not return like delete
public void daoMethod(params) {
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
protected void doInTransactionWithoutResult(TransactionStatus paramTransactionStatus) {
try{
String sqlQuery = "query";
jdbcTemplate.update(query, params);
}catch (Exception e) {
paramTransactionStatus.setRollbackOnly();
}
}
});
}
//for operations where query does return like insert
public int daoMethod(params) {
return transactionTemplate.execute(new TransactionCallback<Integer>() {
public Integer doInTransaction(TransactionStatus paramTransactionStatus) {
String sqlQuery = "query";
Object[] params = params;
int[] types = myTypes;
return jdbcTemplate.update(sqlQuery,params,types);
}
});
}}
答案 1 :(得分:6)
使用@Transactional
。但是,当然,在此之前,您必须为DataSourceTransactionManager
:
// Your DataSource bean definition
@Bean
public DataSource dataSource() {
....
}
// Transaction manager bean definition
@Bean
public DataSourceTransactionManager dataSourceTransactionManager(DataSource dataSource) {
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
dataSourceTransactionManager.setDataSource(dataSource);
return dataSourceTransactionManager;
}
然后你可以使用@Transactional
。服务示例:
@Service
public class MyServiceImpl {
@Autowired
private MyDAO myDAO;
@Transactional
public void insert(Entity entity) {
myDAO.insert(entity);
}
}
答案 2 :(得分:1)
在Spring中管理事务的最简单方法是@Transactional注释,所以你的代码看起来很简单:
@Transactional(rollbackFor = Exception.class)
public void doSomething(...) {
...
}
了解详情:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html
答案 3 :(得分:0)
如果您已正确配置了spring transaction manager / jdbcTemplate,那么您可以始终使用spring提供的@Transactional注释来定义何时回滚事务。但即使你已经定义了回滚并且你的jdbc驱动程序或你的数据库不允许事务(检查TRANSACTION_ISOLATION而不是JdbcConnection),那么spring将使用事务记录,但数据库将忽略这些点。
答案 4 :(得分:0)
DOM