0 0

hibernate web 应用,怎么实现数据排他锁?10

两个人取得同一个版本的数据,离线在web上编辑后,同时或不同时保存,我怎么保证第一个成功,第二个失败,注意是在离线状态。

我的一个办法是,把数据的版本号一同传递保存,但是没有效果。代码如下


	public boolean updateStatus(String ornano, int status, String userid,Integer version) {
		Material ml = this.findByOrnano(ornano);
		ml.setStatus(new Integer(status));
		ml.setLastUpdateBy(new Long(userid));
		ml.setLastUpdateDate(new Date());
		ml.setVersion(version.intValue());
		this.merge(ml);
		return true;
	}

当我设置一个比数据库版本更低的版本号,使数据过期,数据仍然能更新成功!,而且数据库的版本号也递增了。
有没有更好的办法?
2008年6月18日 15:53

3个答案 按时间排序 按投票排序

0 0

采纳的答案

给个思路,希望有所帮助。
做个LockManager,LogManager满足以下条件:

  1. 有一个线程安全的锁队列,队列里的每个锁对象有一个ObjectClass和一个ObjectID,一个用户id,一个最近访问时间,一个默认的过期时间(多少毫秒之类)。该队列给以后台定时线程管理(可以是java.util.Timer,用new Timer(true)创建),定时清除过期锁对象(根据当前时间减去最近访问时间和过期时间比较决定)
  2. 用户ID决定该锁对象归属,锁对象可以重新进入,只要是同一个用户(业务上的真是用户),用户进入该锁之后,自动修改最近访问时间为最近时间。
  3. LockManager类全局唯一,且线程安全,用户需要对数据库某条记录进行编辑,必须以自己的ID,ObjectClass,ObjectId向LockManager申请一把锁,当此ObjectClass以及ObjectId已经有一把锁在LockManager管理之下,判断此锁的用户和当前用户是否匹配。如果匹配,则表示用户重新进入该锁(第2点),返回true,否则返回false,外部程序得知true则显示编辑页面,false则出错页面,表示无法被编辑。
  4. 当用户完成编辑后保存,则此时LockManager根据ObjectClass和ObjectId找到该锁,如果锁是null(即被自动清除且没有其他人申请此锁),视业务严格性决定是否保存,如果可以保存,则调用持久化类进行update;如果锁不是null,则判断是否是当前用户拥有决定下一步操作,可根据业务灵活处置(比如说另存为)。因为锁有失效期,失效后其他用户就可以申请对此记录加锁。


这是以前做的一个锁设计,JVM失效则失效,不适合不间断服务,如果需要不间断服务,需要放在持久化介质上,不支持群集,如果是群集则需要将锁放到共享介质上(数据库,memcache服务器之类)。特点是可以根据业务来调整策略。先验性失败,从用户体验角度更加友好,不会等到保存的时候再失败导致用户抱怨。

2008年6月19日 01:20
0 0

补充,锁队列是FIFO,可以考虑java.util.concurrent.ConcurrentLinkedQueue。该类线程安全,FIFO,且有Iterator。能很好的符合要求,缺点是需要JDK1.5。以前实现此锁的时候较多考虑线程同步问题。另外用户操作时间比较长,可以将同步方法完全放在Lockmanager类上,线程同步时间内可以忽略不计。

2008年6月19日 01:35
0 0

findByOrnano找到的应该是最新版本的object,所以应当是能更新成功的。因为生成的update语句的where条件是按照findByOrnano获得object的version初始值来的。所以貌似你这里的乐观锁起不了作用,我也没想到什么好办法,你可以在这里判断下新获到的object的version和你离线状态获到的version是否一致,不一致证明已经有更新,你再做处理。不知道有没有其他更好的办法。

2008年6月18日 16:12

相关推荐

    Hibernate Web应用的开发步骤

    Hibernate Web应用的开发一般经过以下几个步骤: (1)创建数据库。 (2)将Hibernate所需的JAR包复制到WEB-INF/lib下。 (3)创建Hibernate的配置文件。 (4)利用Hibernate的第三方工具或Eclipse的有关插件从...

    hibernate的乐观锁和悲观锁

    悲观锁的实现主要依赖于数据库级别的锁机制,这是唯一能够真正保证数据访问排他性的方法。即使应用程序内部实现了加锁机制,也无法完全避免外部系统对数据的修改。 **典型应用案例**: 考虑一个场景,需要查询账户...

    Hibernate悲观锁和乐观锁的实现

    在Hibernate源码中,乐观锁的实现主要依赖于`AbstractEntityPersister`类的`checkOptimisticLocking()`方法,它会比较当前对象的版本信息与数据库中的版本信息,如果不同则抛出`StaleObjectStateException`异常。...

    应用SpringMVC与Hibernate进行WEB开发

    5. **国际化支持**:SpringMVC支持多语言,可以通过资源文件轻松实现应用程序的国际化。 ### Hibernate持久化数据 Hibernate是一种开源的对象关系映射(ORM)框架,用于在Java应用中处理数据库的持久化操作。其...

    基于hibernate/dwr框架实现的web项目

    在这个"基于Hibernate/DWR框架实现的Web项目"中,我们可以看到开发者利用了Java Web开发的强大工具,包括Hibernate作为持久层框架,Direct Web Remoting (DWR)作为前端与后端交互的桥梁,以及Oracle数据库作为数据...

    struts+hibernate web小项目

    本项目是一个基于Struts和Hibernate的一对一关系的简单Web应用,非常适合初学者进行学习和实践。 **Struts框架** Struts是Apache软件基金会下的一个开源MVC框架,它为构建基于Java EE平台的Web应用程序提供了一种...

    论坛系统项目(Struts 2+Hibernate+Spring实现)

    论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts 2+Hibernate+Spring实现)论坛系统项目(Struts...

    Struts+Hibernate开发Web应用 源码

    Struts和Hibernate是两种在Java Web开发中广泛使用的开源框架,它们在构建高效、可维护的Web应用程序中扮演着重要角色。Struts是MVC(Model-View-Controller)架构的实现,主要用于处理用户请求和控制业务逻辑,而...

    简单的HIBERNATE应用

    总结,这个“简单的Hibernate应用”提供了学习和实践Hibernate的基础,包括如何配置、创建实体、执行查询以及在Web环境中集成Hibernate的方法。通过深入理解并熟练运用这些知识,开发者可以更高效地进行Java数据库...

    基于Struts+Hibernate+Spring的Web_应用开发

    ### 基于Struts+Hibernate+Spring的Web应用开发 #### 一、实训目标概述 本实训指导书旨在帮助学生深入理解并掌握基于Struts、Hibernate与Spring三种技术的Web应用开发流程与技巧。通过分阶段的学习和实践,使学生...

    Hibernate锁机制_悲观锁和乐观锁

    Hibernate 锁机制_悲观锁和乐观锁 Hibernate 锁机制是指在... Hibernate 的锁机制可以分为悲观锁和乐观锁两种,悲观锁通过数据库层次的锁定来实现,而乐观锁通过应用程序上的逻辑实现版本控制的方法来维护正确的数据。

    JSF+Hibernate搭建WEB应用实例

    JSF+Hibernate开发WEB应用比用SSH开发WEB,更简单,更易上手。本源码通过用户登录的实例,展示了采用JSF和HIBERNATE技术,搭建WEB应用系统的方法。数据库采用SQL2008,实例包含了创建user的SQL脚本。

    hibernate乐观锁和悲观锁学习

    在Hibernate中,我们可以使用`setLockMode`方法对查询结果进行加锁,例如设置`LockMode.UPGRADE`,这将使Hibernate在执行SQL时添加`FOR UPDATE`子句,从而实现悲观锁。 接下来是乐观锁(Optimistic Locking)。与...

    Spring+Hibernate实现用户登录

    本项目"Spring+Hibernate实现用户登录"旨在演示如何整合这两个框架,构建一个能够处理用户登录功能的Web应用程序。下面将详细介绍这个项目涉及的关键知识点。 1. **Spring框架**:Spring是一个全面的Java应用开发...

    struts2+spring +hibernate 整合应用实现用户登陆。

    通过以上步骤,我们可以构建一个完整的Struts2+Spring+Hibernate整合应用,实现用户登录、注册、修改和删除等功能。这种架构在大型企业级应用中很常见,因为它提供了良好的分层设计,提高了代码复用性和可维护性。...

    Spring+Struts2+Hibernate web应用

    一个整合了Spring Struts2 Hibernate的web应用,使用前请阅读Readme

    基于Tapestry+Spring+Hibernate框架的Web应用

    Hibernate还支持缓存机制,可以显著提升数据访问性能,对于构建高性能的Web应用至关重要。 #### 整合框架构建Web应用 整合Tapestry、Spring和Hibernate三大框架,可以构建出层次清晰、解耦良好的Web应用。具体而言...

    struts2+hibernate+mysql实现注册登录

    在这个项目中,“struts2+hibernate+mysql实现注册登录”是一个基础的实战教程,旨在帮助新手理解如何在实际应用中整合这三个技术。 **Struts2** 是一个强大的MVC框架,它负责处理HTTP请求,控制应用程序的流程,并...

    JSP+Hibernate实现留言板

    总的来说,"JSP+Hibernate实现留言板"项目展示了如何利用这两项技术构建一个完整的Web应用。通过结合JSP的视图展示能力和Hibernate的数据处理能力,我们可以轻松地构建出功能强大的留言板系统,同时保持代码的可维护...

    Struts+Hibernate开发web应用随书源码

    7. **国际化与本地化**:Struts支持多语言,源码中可能包含了资源文件(如message.properties)来实现应用的国际化。 8. **异常处理**:Struts提供了一种机制来统一处理应用程序的异常,源码中会看到如何配置和使用...

Global site tag (gtag.js) - Google Analytics