0
我使用Spring 4.0.5中,MySQL 5.6.19和BoneCP与每个插入禁用自动提交0.8.0MySQL的:春季
我的问题是,在应用程序中定义一个事务,MySQL是commiting每次插入或更新,所以它不会进行交易。
首先,我看过像我这样的一些问题,但在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
}
我的问题是,调试一步一步或者强迫失败,首先,二,Thirs时,立即提交到数据库,没有交易行为。
我的代码或我的方法有什么问题吗?我是否应该将INSERT句子直接放在doInTransactionWithoutResult方法中?我应该以另一种方式做到这一点,所以三个插入是以交易方式完成的?
任何帮助将非常感激。 Regards
你正在使用MySQL确保您使用的是支持事务表。 MyISAM表不支持事务,确保它们是InnoDB表。你为什么不使用声明式交易,而是使用手动交易?另外'JdbcTemplate'和'TransactionTemplate'是线程安全的,在你的上下文中创建它们,注入并重用它们。特别是'JdbcTemplate'是一个相当耗时的对象构造。 –
@ m-deinum,谢谢你的回答。我会尝试声明式交易。我使用InnoDB表(已验证)。 –