【发布时间】:2014-06-21 09:03:48
【问题描述】:
我正在使用 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
}
我的问题是,在逐步调试或强制失败时,First、Second、Thirs 会立即提交到数据库,而无需事务处理行为。
我的代码或方法有什么问题吗?我应该将 INSERTs 语句直接放在 doInTransactionWithoutResult 方法中吗?我应该以另一种方式执行此操作,因此三个插入是以事务方式完成的吗?
任何帮助将不胜感激。 问候
【问题讨论】:
-
您使用的是 MySQL,请确保您使用的是支持事务的表。 MyISAM 表不支持事务,请确保它们是 InnoDB 表。为什么不使用声明式事务,而是使用手动事务?
JdbcTemplate和TransactionTemplate也是线程安全的,在你的上下文中创建它们,注入和重用它们。特别是JdbcTemplate是一个相当大且耗时的对象构造。 -
@m-deinum,谢谢你的回答。我将尝试声明性事务。我正在使用 InnoDB 表(已验证)。
标签: mysql spring transactions spring-transactions bonecp