转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6768298.html 

一:需要事务的Session操作

Session操作中,查询类操作是不需要事务就能生效的,如get、query等。

而save、update、delete等操作,则需要提交事务才能生效。

二:DAO层事务管理的缺点

DAO层主要负责数据的持久化操作,因此,也是session操作的主要位置。我们一般在DAO层针对一个表定义增删查改操作的方法,一个方法一个功能。因此,如果在DAO进行事务管理的话,就要每个方法  开启事务——session操作——提交事务——关闭session,这会产生大量重复代码,并且不灵活,如:懒加载(var=session.load(POJO))时,查询变量var在被调用时,才会触发SQL语句进行数据库查询,而在此之前session不能被关闭。如果这个变量被发布出去,如:return到service层,那我们只能在service层关闭session了,这样又要考虑session的传递问题,十分麻烦。

三:一般的事务管理策略

在service中定义事务,是最正确的方式。因为一个service层方法对应着一个业务,一个业务中可能有多个数据操作,因此我们“以业务为单位进行事务管理”。

四:懒加载事务管理

用懒加载查询得到的变量,如果发布到了其他层使用,那么事务管理、session关闭都要随之迁移。既然如此,我们干脆就在“唯一入口和出口”处进行事务管理与session的开启关闭,那就是——Filter。

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
Transaction tx = null;
try {
Session session = HibernateSessionFactory.getSession();
tx = session.beginTransaction();
chain.doFilter(request, response);//传递进去,经历各层处理、View层响应
tx.commit();
} catch (Exception e) {
if (tx!=null&tx.isActive()) {//如果Transcation依旧存在,即系出现异常,回滚事务
tx.rollback();
}
} finally{
session.close();
}
}

最新文章

  1. AjaxHelper简介
  2. 【转载】Serif和Sans-serif字体的区别
  3. php基础31:正则匹配-元字符
  4. MySQL CAST与CONVERT 函数的用法
  5. Android判断用户是平板还是手机的方法
  6. node场景
  7. HTML5 canvas 绘制五星红旗
  8. CLR_Via_C#事件
  9. 在myeclipse下安装svn插件,出现了Could not generate DH keypair,这么一个错误。
  10. python自动化运维:系统基础信息模块
  11. Gradle 1.12用户指南翻译——第五十二章. Maven 插件
  12. DS博客作业01—日期抽象数据类型设计与实现
  13. vue-cli利用router创建单页面
  14. C# yield return 和 yield break
  15. cache2go - cachetable源码分析
  16. .NET CORE学习笔记系列(2)——依赖注入[7]: .NET Core DI框架[服务注册]
  17. DLC 格雷码
  18. oracle查看列数据类型
  19. WorldWind源码剖析系列:视景体类Frustum
  20. Linux——进程管理简单学习笔记(二)

热门文章

  1. linux中解压rar文件
  2. [wxWidgets]_[0基础]_[不常见但有用的类wxStandardPaths]
  3. C++MFC编程笔记day05 文档类-单文档和多文档应用程序
  4. 抢票季:吐槽12306 & 分享抢票经验
  5. Asp.Net Core获取当前上下文对象
  6. 直方图与bin
  7. 解决tensorflow在训练的时候权重是nan问题
  8. RxJava【变换】操作符 map flatMap concatMap buffer MD
  9. 初学 Delphi 嵌入汇编[1] - 汇编语言与机器语言
  10. jQuery实现锚点跳转(就一行代码)