博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring事务注意点
阅读量:6038 次
发布时间:2019-06-20

本文共 1774 字,大约阅读时间需要 5 分钟。

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事务处理时自我调用的解决方案及一些实现方式的风险

转载于:https://www.cnblogs.com/wangliyue/p/6214129.html

你可能感兴趣的文章
Unity3D工程源码目录
查看>>
杀死进程命令
查看>>
cookie 和session 的区别详解
查看>>
Mongodb对集合(表)和数据的CRUD操作
查看>>
Target runtime Apache Tomcat is not defined.错误解决方法
查看>>
VC++ 监视文件(夹)
查看>>
【转】keyCode对照表及JS监听组合按键
查看>>
[Java开发之路](14)反射机制
查看>>
mac gentoo-prefix安装git svn
查看>>
浅尝异步IO
查看>>
C - Train Problem II——(HDU 1023 Catalan 数)
查看>>
Speak loudly
查看>>
iOS-在项目中引入RSA算法
查看>>
[译] 听说你想学 React.js ?
查看>>
gulp压缩合并js与css
查看>>
块级、内联、内联块级
查看>>
Predicate
查看>>
[面试题记录01]实现一个function sum达到一下目的
查看>>
这个季节的忧伤,点到为止
查看>>
mysql通过配置文件进行优化
查看>>