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事务注意点的更多相关文章

  1. spring事务概念理解

    1.数据并发问题 脏读 A事务读取B事务尚未提交的更新数据,并在此数据的基础上操作.如果B事务回滚,则A事务读取的数据就是错误的.即读取了脏数据或者错误数据. 不可重复组 A事务先后读取了B事务提交[ ...

  2. 【Java EE 学习 52】【Spring学习第四天】【Spring与JDBC】【JdbcTemplate创建的三种方式】【Spring事务管理】【事务中使用dbutils则回滚失败!!!??】

    一.JDBC编程特点 静态代码+动态变量=JDBC编程. 静态代码:比如所有的数据库连接池 都实现了DataSource接口,都实现了Connection接口. 动态变量:用户名.密码.连接的数据库. ...

  3. Spring事务

    1.@Transactional 只能被应用到public方法上, 对于其它非public的方法,如果标记了@Transactional也不会报错,但方法没有事务功能.@Transactional 的 ...

  4. spring事务管理器设计思想(二)

    上文见<spring事务管理器设计思想(一)> 对于第二个问题,涉及到事务的传播级别,定义如下: PROPAGATION_REQUIRED-- 如果当前没有事务,就新建一个事务.这是最常见 ...

  5. spring事务管理器设计思想(一)

    在最近做的一个项目里面,涉及到多数据源的操作,比较特殊的是,这多个数据库的表结构完全相同,由于我们使用的ibatis框架作为持久化层,为了防止每一个数据源都配置一套规则,所以重新实现了数据源,根据线程 ...

  6. Spring事务管理的三种方式

    一 .第一种:全注解声明式事务 Xml代码 复制代码 收藏代码 .<?xml version="1.0" encoding="UTF-8"?> .& ...

  7. spring 事务传播特性 和隔离级别

    事务的几种传播特性1. PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务.如果没有事务则开启2. PROPAGATION_SUPPORTS: 如果存在一个事务,支持当前事务 ...

  8. Spring事务管理

    Spring是SSH中的管理员,负责管理其它框架,协调各个部分的工作.今天一起学习一下Spring的事务管理.Spring的事务管理分为声明式跟编程式.声明式就是在Spring的配置文件中进行相关配置 ...

  9. Spring事务传播属性

    Spring 对事务控制的支持统一在 TransactionDefinition 类中描述,该类有以下几个重要的接口方法: int getPropagationBehavior():事务的传播行为 i ...

  10. Spring事务属性的介绍

    Spring声明式事务让我们从复杂的事务处理中得到解脱.使得我们再也无需要去处理获得连接.关闭连接.事务提交和回滚等这些操作.再也无需要我们在与事务相关的方法中处理大量的try-catch-final ...

随机推荐

  1. css3动画实现旋转木马

    写旋转木马的时候,突发奇想想加个遮罩效果,那当然是用box-reflect属性了,然鹅,却被overflow:hidden坑了....... 写的效果就是不出来,太任性了有木有,代码无误呀,也没报错, ...

  2. 搞定导致CPU爆满的“罪魁祸首”

    昨天,正忙着,一个用户来电,说一个系统非常缓慢,导致整个系统无法正常使用,必须马上处理,先看系统资源,通过用户反馈的信息,内存,IO没问题,CPU资源严重紧张,idle持续为零,堆积任务达几百个,系统 ...

  3. [BZOJ2684][CEOI2004]锯木厂选址

    BZOJ权限题! Description 从山顶上到山底下沿着一条直线种植了n棵老树.当地的政府决定把他们砍下来.为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂. 木材只能按照一个方向运输:朝山下运 ...

  4. js中url跳转问题

    问题描述:列表中有不同的企业名字,每个企业名字都有一个不同的链接,用id做为参数区分.点击不同的名字,根据id的不同跳转到对应的详情页,设置连接如下: 1. url = http://localhos ...

  5. linux 添加ftp用户与登录配置详解

    不同类Unix有一定区别 版本不同也有些区别 在linux主机上如何添加ftp用户 (一)修改配置文件 vi /etc/vsftpd/vsftpd.conf 在96行,97,98行 96 chroot ...

  6. jstl的表达式不能解析

    问题:配置问题 解决:web.xml中添加环境的配置,环境配成2.4的版本就ok了 <web-app xmlns="http://java.sun.com/xml/ns/j2ee&qu ...

  7. SQL Server将自己的查询结果作为待查询数据子列之二

    嵌套子查询是SQL语句中比较常用的一种查询方法,开发过程中遇到查询需要将自己的某列作为待查询的数据,在参考别人的SQL语句的写法终于实现了自己需要的功能. 不太和谐查询语句如下: SELECT DIS ...

  8. 用Go自己实现配置文件热加载功能

    说到配置文件热加载,这个功能在很多框架中都提供了,如beego,实现的效果就是当你修改文件后,会把你修改后的配置重新加载到配置文件中,而不用重启程序,这个功能在日常中还是非常实用的,毕竟很多时候,线上 ...

  9. shell常用脚本

    shell常用脚本 author:headsen chen  2017-10-17 15:36:17 个人原创,转载请注明,否则依法追究法律责任 1,vim  name.grep.sh 2,cat   ...

  10. web SPA项目目录、命名规范

    项目结构:├── build ├── docs ├── package.json ├── src │ ├── components │ │ ├── List │ │ │ ├── index.js │ ...