Mysql:在Spring中禁用每个插入的自动提交
我正在使用Spring4.0.5、Mysql 5.6.19和BoneCP0.8.0 我的问题是,在应用程序中定义的一个事务中,MySql提交每个插入或更新,因此它不进行事务 首先,我读过一些类似于我的问题,但在Spring数据源中设置它对我不起作用:Mysql:在Spring中禁用每个插入的自动提交,mysql,spring,transactions,spring-transactions,bonecp,Mysql,Spring,Transactions,Spring Transactions,Bonecp,我正在使用Spring4.0.5、Mysql 5.6.19和BoneCP0.8.0 我的问题是,在应用程序中定义的一个事务中,MySql提交每个插入或更新,因此它不进行事务 首先,我读过一些类似于我的问题,但在Spring数据源中设置它对我不起作用: <property name="defaultAutoCommit" value="false" /> MyTx.java } MyDAO.java 我的问题是,当一步一步地调试或强制失败时,首先,其次,Thirs会立即提交到数据库,
<property name="defaultAutoCommit" value="false" />
MyTx.java
}
MyDAO.java
我的问题是,当一步一步地调试或强制失败时,首先,其次,Thirs会立即提交到数据库,而不会出现事务行为
我的代码或方法是否有任何错误?我应该把插入句直接放在doInTransactionWithoutResult方法中吗?我是否应该以另一种方式执行此操作,因此这三个插入是以事务方式完成的
任何帮助都将不胜感激。
正如Martin所建议的,带有@Transactional的声明性事务更适合这一点,对我来说也更合适。所以,谢谢你 这两个链接在本主题中对我很有帮助:
您使用的是MySQL,请确保您使用的表支持事务。MyISAM表不支持事务,请确保它们是InnoDB表。为什么不使用声明性事务而使用手动事务?JdbcTemplate和TransactionTemplate也是线程安全的,在您的上下文中创建它们,注入并重用它们。尤其是JdbcTemplate是一个相当大且耗时的对象构造。@m-deinum,谢谢您的回答。我将尝试声明性事务。我正在使用InnoDB表。
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;
}
}
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);
}
private void saveTargetBean(...) {
jdbcTemplate.update("INSERT...", ...); // First
jdbcTemplate.update("INSERT...", ...); // Second
jdbcTemplate.update("INSERT...", ...); // Third
}