dataSource.setDefaultAutoCommit(false);
JdbcTemplate template = new JdbcTemplate(dataSource);
DataSourceTransactionManager tran = new DataSourceTransactionManager(dataSource);
DefaultTransactionDefinition def = new DefaultTransactionDefinition();//事务定义类
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
TransactionStatus status = transactionManager.getTransaction(def);//返回事务对象
try {
String sql = "update TB_MEMBER set ACCOUNT=ACCOUNT+? where OPENID=?";
String sql2 = "update TB_MEMBER set ACCOUNT=ACCOUNT+? where OPENID=?";
template.update("update TB_MEMBER set ACCOUNT=ACCOUNT+"+account+" where OPENID='"+openid+"'");
template.update("update TB_MEMBER set ACCOUNT=ACCOUNT+"+account+" where OPENID="+openid);
transactionManager.commit(status);
} catch (Exception ex) {
System.out.println("##############3抛异常");
transactionManager.rollback(status);
}finally{
dataSource.setDefaultAutoCommit(true);
}
问题描述:第一条sql是正常的,执行的时候第二条报错,但是第一条的操作还是会入库,我的预想是两条都回滚。求大神帮忙看看。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
为什么这代码格式这么奇葩
JdbcTemplate<spanstyle="font-family:宋体;">操作采用的是<spanstyle="font-family:Calibri;">JDBC<spanstyle="font-family:宋体;">默认的<spanstyle="font-family:Calibri;">AutoCommit<spanstyle="font-family:宋体;">模式,也就是说我们还无法保证数据操作的原子性(要么全部生效,要么全部无效),如:
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.update("UPDATE user SET age = 10 WHERE id = 'erica'");
jdbcTemplate.update("UPDATE user SET age = age+1 WHERE id = 'erica'");
由于采用了<spanstyle="font-family:Calibri;">AutoCommit<spanstyle="font-family:宋体;">模式,第一个<spanstyle="font-family:Calibri;">update<spanstyle="font-family:宋体;">操作完成之后被自动提交,数据库中”<spanstyle="font-family:Calibri;">erica<spanstyle="font-family:宋体;">”对应的记录已经被更新,如果第二个操作失败,我们无法使得整个事务回滚到最初状态。
回复<aclass='referer'target='_blank'>@蓝川逸风:问题解决了吗请给我最佳答案吧嘿嘿回复<aclass='referer'target='_blank'>@蓝川逸风:你看下这个博客http://blog.csdn.net/sprita1/article/details/8084909另外建议你用配置文件那我要有回滚的效果要怎么做,不用jdbctemplat吗你begin没有?怎么begin,还是用配置文件把,编程式的感觉不靠谱