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 。

  • 相关阅读:
    python pandas里面的一些函数及用法
    Python enumerate() 函数
    论文笔记:EPTD模型/ Efficient and Privacy-Preserving Truth Discovery in Mobile Crowd Sensing Systems
    论文笔记:Adversarial Attacks and Defenses in Deep Learning 对抗训练部分
    一周入门Linux 基础篇 虚拟机快照
    一周入门Linux 基础篇 虚拟机克隆
    一周入门Linux 基础篇 网络连接的三种方式
    一周入门Linux 基础篇 安装vm和Centos
    B站考研网课推荐
    关于我
  • 原文地址:https://www.cnblogs.com/jimmy-c/p/4143899.html
Copyright © 2011-2022 走看看