开发者社区 问答 正文

spring事务问题?报错

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是正常的,执行的时候第二条报错,但是第一条的操作还是会入库,我的预想是两条都回滚。求大神帮忙看看。



展开
收起
爱吃鱼的程序员 2020-06-12 10:28:24 643 分享 版权
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    为什么这代码格式这么奇葩

    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,还是用配置文件把,编程式的感觉不靠谱

    2020-06-12 10:28:40
    赞同 展开评论
问答分类:
问答地址: