spring事务问题

蓝川逸风 发布于 2015/10/29 15:55
阅读 151
收藏 0
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是正常的,执行的时候第二条报错,但是第一条的操作还是会入库,我的预想是两条都回滚。求大神帮忙看看。



加载中
0
beyondforever68
beyondforever68
为什么这代码格式这么奇葩
0
狮子暴走
狮子暴走

JdbcTemplate操作采用的是JDBC默认的AutoCommit模式,也就是说我们还无法保证数据操作的原子性(要么全部生效,要么全部无效),如:

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'");

由于采用了AutoCommit模式,第一个update操作完成之后被自动提交,数据库中”erica”对应的记录已经被更新,如果第二个操作失败,我们无法使得整个事务回滚到最初状态。

狮子暴走
狮子暴走
回复 @蓝川逸风 : 问题解决了吗 请给我最佳答案吧 嘿嘿
狮子暴走
狮子暴走
回复 @蓝川逸风 : 你看下这个博客http://blog.csdn.net/sprita1/article/details/8084909 另外建议你 用配置文件
蓝川逸风
蓝川逸风
那我要有回滚的效果要怎么做,不用jdbctemplat吗
0
GITTODO
GITTODO
你begin没有?
蓝川逸风
蓝川逸风
怎么begin,还是用配置文件把,编程式的感觉不靠谱
返回顶部
顶部