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 。
SpringMVC+Hibernate架构save方法事务未提交的更多相关文章
- 【hibernate 执行方法未插入数据库】hibernate的save方法成功执行,但是未插入到数据库
今天做项目,碰上这个问题: hibernate的save方法成功执行,但是未插入到数据库. Dao层代码: @Override public void save(T t) { this.getSess ...
- .NET分布式事务未提交造成6107错误或系统被挂起的问题分析定位
问题描述: 系统中多个功能不定期出现“Unable to get error message (6107) (0).”错误,即分布式事务超时,但报出错误的部分功能根本没有使用分布式事务. 原因分析: ...
- SQLServer之创建事务未提交读
未提交读注意事项 使用 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 指定会话的锁定级别. 一次只能设置一个隔离级别选项,而且设置的选项将一直对那个 ...
- spring+springmvc+hibernate架构、maven分模块开发样例小项目案例
maven分模块开发样例小项目案例 spring+springmvc+hibernate架构 以用户管理做測试,分dao,sevices,web层,分模块开发測试!因时间关系.仅仅測查询成功.其它的准 ...
- 记一次mysql事务未提交导致锁未释放的问题
记一次mysql事务未提交导致锁未释放的问题 ## 查看未提交的事务(3秒内未操作的事务) SELECT p.ID AS conn_id, P.USER AS login_user, P.HOST A ...
- backbone Model调用save方法的时候提交方式
horizon使用的是backbone框架,但是我们的后台api都是只接收post请求,请求的路径为/api/,根据backbone的官档解释: backbone的model.save方法会判断当前的 ...
- SpringMVC+Hibernate 使用 session.update(obj) 未更新的问题
1.使用spring控制事务 2.使用session.update(obj)执行更新 spring事务配置: <bean id="transactionBese" class ...
- Hibernate的save方法不能进行数据库插入
问题描述 在 MyEcplise 上运行 tomcat,利用 po 模板自动生成 po 文件,调用 po 的 save 方法,不报错,但是无法把数据插入数据库 applicationContext.x ...
- MySQL事务未提交导致整个表锁死
问题及说明: 当一个SQL事务执行完了,但未COMMIT,后面的SQL想要执行就是被锁,超时结束:报错信息如下: mysql> ERROR 1205 (HY000): Lock wait tim ...
随机推荐
- CI框架中自定义view文件夹位置
要想自定义view文件夹的位置,首先要了解CI框架时如何加载view文件夹的. CI中默认调用view的方法是: $this->load->view(); //这一行代码的原理是什么呢?请 ...
- hadoop的相关资料链接
hadoop的资料整理博客 http://www.itpub.net/thread-1588509-1-1.html
- Linux源码的目录结构
Linux用来支持各种体系结构的源代码包含大约4500个C语言程序,存放在270个左右的子目录下,总共大约包含200万行代码,大概占用58MB磁盘空间. 源代码所有在目录:/usr/src/linu ...
- jmap命令
一.jmap -heap PID using parallel threads in the new generation. ##新生代采用的是并行线程处理方式 using thread-local ...
- Leetcode 104. Maximum Depth of Binary Tree(二叉树的最大深度)
Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the long ...
- ASP保存远程图片文件到本地代码
<% Function SaveRemoteFile(LocalFileName,RemoteFileUrl) SaveRemoteFile=True dim Ads,Retrieval,Get ...
- Android数据存储方式之SharedPreferences
Android平台给我们提供了一个SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数.使用SharedPreferences保存数据,其背后是用xml文件存放数 ...
- HashMap使用
/* * 测试HashMap的应用,判断 */ import java.util.HashMap; public class HuaWeiTest { private static final Int ...
- unity访问php
长连接,弱联网.不好意思,这俩不是一个意思. 反过来说,短连接,强联网,是不是有点别扭呢. 你可以不会php,甚至你可以不知道php是干什么的. 百度php安装环境,自行搭建好环境,顺便测试一下.(下 ...
- VS2010类似Eclipse文件查找功能-定位到
快捷键:Ctrl + , 打开定位到窗口,可以在文件或类文件中查找内容.