Spring事务注意点
service中未带事务的方法调用了自身带事务的方法时,按下面写法数据是提交不了的。
public String getMaxSystemVersionNo() {
SystemVersion version = systemVersionDao.getMaxSystemVersion();
version.setUpgradeDate(new Date());
this.updateSystemVersion(version);
return version.getVersion();
}
public int updateSystemVersion(SystemVersion version) {
return systemVersionDao.updateSystemVersion(version);
}
原因:因为get开头的方法在spring事务配置中是不带任何事务的,所以调用自身带事务方法时也是以非事务的方式运行。如果是调用其他service中带事务方法时是可以开启事务的。
解决方法一:
下面写法可以使不带事务的方法变为带事务,能提交数据。
public String getMaxSystemVersionNo() {
SystemVersion version = systemVersionDao.getMaxSystemVersion();
// 按下面这种写法取得spring bean,否则update方不能启事务
version.setUpgradeDate(new Date());
SystemVersionService service = (SystemVersionService) ApplicationContextHolder.getApplicationContext().getBean(
"systemVersionService");
service.updateSystemVersion(version);
return version.getVersion();
}
解决方法二:
使该service实现 BeanSelfAware 接口类,并在该类中添加自身serivce属性, 如下写法可以使不带事务的方法变为带事务,能提交数据。具体参考类FundsAlipayServiceImpl.java中的写法。
public class SystemVersionServiceImpl implements SystemVersionService, BeanSelfAware {
private SystemVersionService selfBean;
@Cacheable(id = "getMaxSystemVersionNo")
public String getMaxSystemVersionNo() {
SystemVersion version = systemVersionDao.getMaxSystemVersion();
// 按下面这种写法取得spring bean,否则update方不能启事务
version.setUpgradeDate(new Date());
selfBean.updateSystemVersion(version);
return version.getVersion();
}
@Override
public void setSelf(Object proxyBean) {
this.selfBean = (SystemVersionService) proxyBean;
}
}
注:该写法在tddl读写分离时写操作有可能发布到从库上。
已解决,原因如下:
selfBean.updateSystemVersion(version)方法没有走AOP切面,从而导致没有启用事务,而tddl是通过事务判断走主库还是从库的,没有启用事务所以就走从库了。
selfBean方法没有走AOP切面的原因是service相互依赖调用引起的,详见下面帖子:
Spring事务处理时自我调用的解决方案及一些实现方式的风险
http://www.iteye.com/topic/1122740
Spring事务注意点的更多相关文章
- spring事务概念理解
1.数据并发问题 脏读 A事务读取B事务尚未提交的更新数据,并在此数据的基础上操作.如果B事务回滚,则A事务读取的数据就是错误的.即读取了脏数据或者错误数据. 不可重复组 A事务先后读取了B事务提交[ ...
- 【Java EE 学习 52】【Spring学习第四天】【Spring与JDBC】【JdbcTemplate创建的三种方式】【Spring事务管理】【事务中使用dbutils则回滚失败!!!??】
一.JDBC编程特点 静态代码+动态变量=JDBC编程. 静态代码:比如所有的数据库连接池 都实现了DataSource接口,都实现了Connection接口. 动态变量:用户名.密码.连接的数据库. ...
- Spring事务
1.@Transactional 只能被应用到public方法上, 对于其它非public的方法,如果标记了@Transactional也不会报错,但方法没有事务功能.@Transactional 的 ...
- spring事务管理器设计思想(二)
上文见<spring事务管理器设计思想(一)> 对于第二个问题,涉及到事务的传播级别,定义如下: PROPAGATION_REQUIRED-- 如果当前没有事务,就新建一个事务.这是最常见 ...
- spring事务管理器设计思想(一)
在最近做的一个项目里面,涉及到多数据源的操作,比较特殊的是,这多个数据库的表结构完全相同,由于我们使用的ibatis框架作为持久化层,为了防止每一个数据源都配置一套规则,所以重新实现了数据源,根据线程 ...
- Spring事务管理的三种方式
一 .第一种:全注解声明式事务 Xml代码 复制代码 收藏代码 .<?xml version="1.0" encoding="UTF-8"?> .& ...
- spring 事务传播特性 和隔离级别
事务的几种传播特性1. PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务.如果没有事务则开启2. PROPAGATION_SUPPORTS: 如果存在一个事务,支持当前事务 ...
- Spring事务管理
Spring是SSH中的管理员,负责管理其它框架,协调各个部分的工作.今天一起学习一下Spring的事务管理.Spring的事务管理分为声明式跟编程式.声明式就是在Spring的配置文件中进行相关配置 ...
- Spring事务传播属性
Spring 对事务控制的支持统一在 TransactionDefinition 类中描述,该类有以下几个重要的接口方法: int getPropagationBehavior():事务的传播行为 i ...
- Spring事务属性的介绍
Spring声明式事务让我们从复杂的事务处理中得到解脱.使得我们再也无需要去处理获得连接.关闭连接.事务提交和回滚等这些操作.再也无需要我们在与事务相关的方法中处理大量的try-catch-final ...
随机推荐
- 【BZOJ3262】陌上花开(CDQ分治)
[BZOJ3262]陌上花开(CDQ分治) 题解 原来放过这道题目,题面在这里 树套树的做法也请点上面 这回用CDQ分治做的 其实也很简单, 对于第一维排序之后 显然只有前面的对后面的才会产生贡献 那 ...
- iOS开发--XMPPFramework--环境的配置(一)
一.XMPPFramework概述 XMPPFramework是一个OS X/iOS平台的开源项目,使用Objective-C实现了XMPP协议(RFC-3920),同时还提供了用于读写XML的工具, ...
- Tomcat 请求处理流程详解
Overview Connector 启动以后会启动一组线程用于不同阶段的请求处理过程. Acceptor 线程组.用于接受新连接,并将新连接封装一下,选择一个 Poller 将新连接添加到 Poll ...
- 超文本传输协议 - HTTP / 1.1(Hypertext Transfer Protocol -- HTTP/1.1)之方法定义(Method Definitions)
9方法定义 下面定义了HTTP / 1.1的一组常用方法.尽管可以扩展这个集合,但是另外的方法不能假定为单独扩展的客户端和服务器共享相同的语义. 主机请求头域(14.23节)必须伴随所有的HTTP / ...
- php 命令行插件 - phpsh
phpsh 是php的一个命令行插件,个人觉得很不错,在此简单介绍下: 1.安装 readline sudo easy_install readline 2.到 https://github.com/ ...
- Android RecyclerView 滚动到中间位置
最近看到QQ音乐的歌词每次滑动后都可以滚回到中间位置.觉得甚是神奇,打开开发者模式显示布局,发现歌词部分不是采用 android 控件的写的,应该是前端写的.于是,我想,能不能用 recyclerVi ...
- c标准头文件
好多C语言库函数参考还是用的TC的库函数参考,因此特地把现在C语言(C99)标准库函数的24个头文件列表如下:assert.h types.h(C99) signal.h stdlib.h c ...
- secureCRT的安装及破解
secureCRT是我们平时都会用到的终端仿真程序,所谓是居家旅行必备神器啊,下面就说说怎么安装破解secureCRT. (网上有破解版和一些绿色版,感觉或多或少都有点问题,比如我用便携版就有问题,所 ...
- .net core实现redisClient
引言 最近工作上有需要使用redis,于是便心血来潮打算自己写一个C#客户端.经过几天的努力,目前该客户端已经基本成型,下面简单介绍一下. 通信协议 要想自行实现redisClient,则必须先要了解 ...
- Django+xadmin打造在线教育平台(三)
五.完成注册.找回密码和激活验证码功能 5.1.用户注册 register.html拷贝到templates目录 (1)users/views.py class RegisterView(View): ...