我正在使用Spring 4.0.5,Mysql 5.6.19和BoneCP 0.8.0
我的问题是,在应用程序中定义的一个事务中,MySql提交每个插入或更新,因此它不进行事务。
首先,我已经阅读了一些像我这样的问题,但是在Spring数据源中设置这个问题并不适用于我:
<property name="defaultAutoCommit" value="false" />
我的课程是这些:
DBWriter.java
private DataSourceTransactionManager txManager; // Injected in Spring Beans XML
private IMyDAO writerDAO;
public void saveBeans(DataContainer targetData) throws Throwable{
try {
JdbcTemplate templateTransaction = new JdbcTemplate(txManager.getDataSource());
MyTx newTx = new MyTx(targetData, templateTransaction, writerDAO);
TransactionTemplate txTemplate = new TransactionTemplate(txManager);
txTemplate.execute(newTx);
} catch (Throwable e) {
logger.error("Error saving into DB", e);
throw e;
}
}
MyTx.java
public class MyTx extends TransactionCallbackWithoutResult {
private IMyDAO writerDAO;
private DataContainer finalData;
private JdbcTemplate txTemplate;
public MyTx(DataContainer newData, JdbcTemplate newTxTemplate, IMyDAO writerDAO){
this.finalData = newData;
this.txTemplate = newTxTemplate;
this.writerDAO = writerDAO;
}
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
writerDAO.saveTargetBean(newData, txTemplate);
}
}
MyDAO.java
private void saveTargetBean(...) {
jdbcTemplate.update("INSERT...", ...); // First
jdbcTemplate.update("INSERT...", ...); // Second
jdbcTemplate.update("INSERT...", ...); // Third
}
我的问题是,在逐步调试或强制失败时,第一个,第二个,第三个立即提交到数据库,无需事务行为。
我的代码或方法有什么问题吗?我应该将INSERT句子直接放在 doInTransactionWithoutResult 方法中吗?我应该以另一种方式做到这一点,所以这三个插入是以事务方式完成的吗?
非常感谢任何帮助。 此致
答案 0 :(得分:0)
正如马丁所说,与@Transactional的声明性交易对此更好,对我有用。所以,谢谢你
在这个主题中,这两个链接对我非常有帮助: