zoukankan      html  css  js  c++  java
  • SpringMVC+Hibernate架构save方法事务未提交

      今天同事遇到一个问题,一起研究,最后解决,让我对spring的事务管理又加深了印象。

      先简单说一下项目:项目是Spring和Hibernate集成的JavaEE项目,MVC架构。

      外包在service层一个以get开头的方法中写了一些业务逻辑,分别调用了dao层的save和get方法,但是发现get的数据正常显示,数据表中该save的并没有存入数据表,查hibernate生成的sql也只查到了get的语句,没有发现save的语句,也没有报任何错误。很奇怪的现象,不怕报错,就怕它不报错~

      遂检查了一遍代码,没有发现嫌疑。打断点跟踪发现save的这玩意儿可以在程序中get得到,证明hibernate缓存中有save进去的值,可能是hibernate没有提交save,可是写在同一个方法中的get正常提交了。于是想到了配置问题,因为在service层配置了事务,而其他层没有。

      所以,找到了spring的配置文件:

                <tx:method name="get*" propagation="REQUIRED" read-only="true"/>
                <tx:method name="save*" propagation="REQUIRED"/>

    郝然发现其中以get开头的service方法的事务配置了只读属性,而以save开头的service方法的read-only是默认值false。

      原因找到了:因为service方法是以get开头的,所以只有读的权限没有写的权限,无法提交save动作。

    解决方案:

      1、最简单。方法名字别以get开头,以其他配置了REQUIRED隔离级别前缀的字符串开头。

      2、比较规范。DAO层的基本增删改查动作都在service层实现一遍(调用DAO),并为其配置相应权限的事务,提供统一的带独立事务的增删改查服务方法,然后无论本service类内还是类外都调用这几个基本增删改查方法去实现业务逻辑。

      笔者推荐方案2 。

  • 相关阅读:
    intelliJ IDEA 全屏键盘手
    NoNodeAvailableException异常的解决
    Java HotSpot(TM) Client VM 与 server VM 的配置
    乐优商城问题1:新增品牌失败
    Linux安装nginx的环境要求
    NeoVIM安装使用
    ubuntu18.04 开机定时启动任务
    【Eclipse+PyDev】使用Python的IDE安装及配置详解
    ARM开发板挂载Ubuntu18.04主机的NFS共享文件夹
    Ubuntu18.04 解决umount: /mnt: device is busy
  • 原文地址:https://www.cnblogs.com/jimmy-c/p/4143899.html
Copyright © 2011-2022 走看看