使用的事务管理是
org.springframework.jdbc.datasource.DataSourceTransactionManager
一、刚开始事务是这样实现的
TransactionStatus ts = transactionManager.getTransaction(null); try { // 得到用户信息 User user = userMapper.selectByPrimaryKey(userId); user.setHealthBeans(user.getHealthBeans() == null ? 0 : user.getHealthBeans()); Article article = articleMapper.selectByPrimaryKey(articleId); User createrUser = userMapper.selectByPrimaryKey(article.getCreater()); HealthBeansRecord record = new HealthBeansRecord(); healthBeansRecordMapper.insertSelective(record); record.setNumber((byte) +exceptionalCount); healthBeansRecordMapper.insertSelective(record); userMapper.modifyHealthBeans(userId, -exceptionalCount); userMapper.modifyHealthBeans(createrUser.getId(), exceptionalCount); transactionManager.commit(ts); } catch (Exception e) { transactionManager.rollback(ts); throw new BasicException(String.format("出现异常,异常原因:%s,参数userId:%s,参数articleId:%s", e.getMessage(), userId, articleId), e); }
但是会时不时的出现:
### Error updating database. Cause: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction ### The error may involve defaultParameterMap ### The error occurred while setting parameters
二、改成如下方式
try { ts = transactionManager.getTransaction(null); // 得到用户信息 User user = userMapper.selectByPrimaryKey(userId); user.setHealthBeans(user.getHealthBeans() == null ? 0 : user.getHealthBeans()); Article article = articleMapper.selectByPrimaryKey(articleId); User createrUser = userMapper.selectByPrimaryKey(article.getCreater()); HealthBeansRecord record = new HealthBeansRecord(); healthBeansRecordMapper.insertSelective(record); record.setUserId(createrUser.getId()); record.setNumber((byte) +exceptionalCount); healthBeansRecordMapper.insertSelective(record); userMapper.modifyHealthBeans(userId, -exceptionalCount); userMapper.modifyHealthBeans(createrUser.getId(), exceptionalCount); transactionManager.commit(ts); } catch (Exception e) { transactionManager.rollback(ts); throw new BasicException(String.format("出现异常,异常原因:%s,参数userId:%s,参数articleId:%s", e.getMessage(), userId, articleId), e); }
将TransactionStatus的声明为类的成员变量,在try catch中完成事务的使用。这样锁超时的错误少了很多,但是还会出现超时的情况
三、给使用事务的代码添加类级异步锁
try { synchronized (getClass()) { ts = transactionManager.getTransaction(null); // 得到用户信息 User user = userMapper.selectByPrimaryKey(userId); user.setHealthBeans(user.getHealthBeans() == null ? 0 : user.getHealthBeans()); Article article = articleMapper.selectByPrimaryKey(articleId); User createrUser = userMapper.selectByPrimaryKey(article.getCreater()); HealthBeansRecord record = new HealthBeansRecord(); healthBeansRecordMapper.insertSelective(record); record.setUserId(createrUser.getId()); record.setNumber((byte) +exceptionalCount); healthBeansRecordMapper.insertSelective(record); userMapper.modifyHealthBeans(userId, -exceptionalCount); userMapper.modifyHealthBeans(createrUser.getId(), exceptionalCount); transactionManager.commit(ts); } } catch (Exception e) { transactionManager.rollback(ts); throw new BasicException(String.format("出现异常,异常原因:%s,参数userId:%s,参数articleId:%s", e.getMessage(), userId, articleId), e); }
这样一来,经过测试,不再出现锁超时的情况了。
但是总感觉,这样的异步控制是不应该在业务代码中进行控制的!
相关推荐
本文处理spring+mybatis,或springjdbc,对oracle事务不能提交的问题分析与解决
后端基于springmybatis的微信小程序商城后端基于springmybatis的微信小程序商城后端基于springmybatis的微信小程序商城后端基于springmybatis的微信小程序商城后端基于springmybatis的微信小程序商城后端基于spring...
花了一晚上时间终于搞出来了Spring整合Mybatis事务回滚(Mysql数据库),控制Service层中的多次插入操作,多次操作整体是一个事务。 里面有缘嘛和jar包,资源为war包,导入即可。运行Test类中的测试代码即可。 建表...
Spring+Mybatis+Spring MVC的全部jar包,可以用于练习测试;
spring+mybatis开发所有jar包
Struts2SpringMybatis 增删改查,里面的Struts2,spring,Mybatis配置文件都是模块化的管理,实现了社会版本的配置,不再是个人玩弄的小项目。具体的 sql语句也已经加到了WEBRROT目录下面了,自己下载下来可以详细看...
spring mybatis shiro 共6天 8部分 第2部分 spring mybatis shiro 共6天 8部分 第2部分
这是用maven,spring,mybatis整合的一个项目,只是在下边spring,mybatis项目整合的基础上加入了maven,如果你有需要可以下下来看看,在我百度空间里有关于这个的介绍 地址:...
《spring+mybatis 企业应用实战》源码、类库全资料
详细请看文章 完整的spring mybatis项目整合案例(含代码) 有详细讲解 有问题可评论
spring+mybatis的声明式事务
maven spring mybatis mysql 事务管理 企业级开发
spring mybatis atomikos 分布式事务 自己写的小demo 包含依赖包
包含mySQL数据库初始化脚本,包含spring+spring web MVC+mybatis的整合,包含mabatis-generator这个插件的使用以及配置,整个工程可以正常运行。
struts2、spring与mybatis整合 包含简单登录功能 事务配置,运行JunitTestVillageArticle的modify测试。配置说明参考注释
Spring 与 各框架的组各下来,版本就特别的多,针对简单的 使用注解来管理事务的,研究了两天,要不网上...说一下环境 Intellij Idea 15 + Maven + Spring 4.25 + Mybatis 3使用注解的方式,进行的事务回滚,欢迎测试。
比较实用的springMvc+spring+Mybatis 实战案例
spring_mybatis 整合jar包,基本常用jar包的整合,。。。。。。。。。。。。。。。
《Spring mybatis 企业应用实战》完整版.z01 《Spring mybatis 企业应用实战》完整版.z02 《Spring mybatis 企业应用实战》完整版.z03 《Spring mybatis 企业应用实战》完整版.z04 《Spring mybatis 企业应用实战》...