Hibernate的事务和并发(一) - 编程入门网
于你所选择的数据库事务划分机制。这种实现模式被称之为 ThreadLocal Session和 Open Session in View。你可以很容易的扩展本文前面章节展示的 HibernateUtil 辅助类来实现这种模式。当然,你必须找到一种实现拦截器的方法,并 且可以把拦截器集成到你的应用环境中。请参考Hibernate网站上面的提示和例子。
Hibernate的事务和并发(一)(2)时间:2011-01-1112.1.2.应用程序事务(Application transactions) session-per-request模式不仅仅是一个可以用来设计操作单元的有用概念。很多业务处理流程都需 要一系列完整的和用户之间的交互,即用户对数据库的交叉访问。在基于web的应用和企业 应用中,跨用户交互的数据库事务是无法接受的。考虑下面的例子: 在界面的第一屏,打开对话框,用户所看到的数据是被一个特定的 Session 和数据 库事务载入(load)的。用户可以随意修改对话框中的数据对象。 5分钟后,用户点击“保存”,期望所做出的修改被持久化;同时他也期望自己是唯一修改这个信息的人,不会出现 修改冲突。 从用户的角度来看,我们把这个操作单元称为应用程序长事务(application transaction)。 在你的应用程序中,可以有很多种方法来实现它。 头一个幼稚的做法是,在用户思考的过程中,保持Session和数据库事务是打开的, 保持数据库锁定,以阻止并发修改,从而保证数据库事务隔离级别和原子操作。这种方式当然是一个反模式, 因为数据库锁定的维持会导致应用程序无法扩展并发用户的数目。 很明显,我们必须使用多个数据库事务来实现一个应用程序事务。在这个例子中,维护业务处理流程的 事务隔离变成了应用程序层的部分责任。单个应用程序事务通常跨越多个数据库事务。如果仅仅只有一 个数据库事务(最后的那个事务)保存更新过的数据,而所有其他事务只是单纯的读取数据(例如在一 个跨越多个请求/响应周期的向导风格的对话框中),那么应用程序事务将保证其原子性。这种方式比听 起来还要容易实现,特别是当你使用了Hibernate的下述特性的时候: 自动版本化 - Hibernate能够自动进行乐观并发控制 ,如果在用户思考 的过程中发生并发修改冲突,Hibernate能够自动检测到。 脱管对象(Detached Objects)- 如果你决定采用前面已经讨论过的 session-per-request模式,所有载入的实例在用户思考的过程 中都处于与Session脱离的状态。Hibernate允许你把与Session脱离的对象重新关联到Session 上,并且对修改进行持久化,这种模式被称为 session-per-request-with-detached-objects。自动版本化被用来隔离并发修改。 长生命周期的Session (Long Session)- Hibernate 的Session 可以在数据库事务提交之后和底层的JDBC连接断开,当一个新的客户端请求到来的时候,它又重新连接上底层的 JDBC连接。这种模式被称之为session-per-application-transaction,这种情况可 能会造成不必要的Session和JDBC连接的重新关联。自动版本化被用来隔离并发修改。 session-per-request-with-detached-objects 和 session-per-application-transaction 各有优缺点,我们在本章后面乐观并发 控制那部分再进行讨论。 12.1.3.关注对象标识(Considering object identity) 应用程序可能在两个不同的Session中并发访问同一持久化状态,但是, 一个持久化类的实例无法在两个 Session中共享。因此有两种不同的标识语义: 数据库标识 foo.getId().equals( bar.getId() ) JVM 标识 foo==bar 对于那些关联到 特定Session (也就是在单个Session的范围内)上的对象来说,这 两种标识的语义是等价的,与数据库标识对应的JVM标识是由Hibernate来保 证的。不过,当应用程序在两个不同的session中并发访问具有同一持久化标 识 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |