超级sonGoku 2010-03-29 10:25
浏览 374
已采纳

[Web页面操作并发问题]两个用户同时操作页面

主表:用户类别表 USERS_TYPE
用户表:USERS(该表存在用户类别的外键)

界面一:管理用户类别界面
界面二:管理用户界面

问题:
有两个用户A和B,A处在界面一,准备对用户类别进行删除。
B处在界面二并打开了添加用户界面,此时用户类别下拉框包含A准备删除的用户类别。
此时,用户A删除了那个用户类别。然后用户B点击了保存。
结果得到了一个未知类别的用户记录。

请问如何处理可以解决这种错误记录的发生?

备选方案:
1、在添加用户的Service中,添加对用户类别是否存在的判定代码,但是会造成性能降低。但我这只是举个例子,现实中的情况是有很多关联关系需要去Check。

请问有没有更好的解决方案?

  • 写回答

3条回答 默认 最新

  • wanghaolovezlq 2010-03-29 10:32
    关注

    有乐观锁和悲观锁的两种处理方式

    乐观锁与悲观锁是对于并发性的限制。锁是具有排他性的。悲观锁,是悲观的认为自己在读取数据的时候别人也在对数据进行读写,所以在自己读写数据的时候对数据进行锁定,直到自己操作完毕。乐观锁正好是相反的,是乐观的认为在自己对数据进行读写的时候不会有其他人对数据进行读写,所以不进行数据库机制的限制,而是进行,版本的限制,而且乐观锁不光光只有版本限制,还有更新时间限制,与字段对比限制。用悲观锁机制制作的软件代表作品是VSS,用乐观锁机制制作的软件代表作品是CVS。

    下面我们看看怎么调用悲观锁,我只写一个代码片段,其他地方没有大的改变,如果大家想尝试下结果的话,可以自己写下看看, session.load(User.class,1,LockMode.UPGRADE);通过这句话调用锁机制,如果其他人想要用的话呢,就要一直等到 Transaction commit以后才可以。

    乐观锁,乐观锁其实并不是一种锁,而是一种冲突检测机制,他可以随时改变数据,但是在save和update的时候会进行检测,检测版本是否符合标准,如果版本小于等于新版本就不会对数据进行改动,相反还会报错,说是一个脏数据,说明数据有问题,这样也会造成更新丢失。
    我们要怎么调用乐观锁呢,相对于悲观锁,乐观锁的调用还是比较麻烦的,我们需要在数据库中加入version,也需要在持久类中加入verison,这个version不用我们进行管理是由hibernate进行管理的。还要在*.hbm.xml中的class标签中配置上
    optimistic-lock="verson"这里说明的是这个version不是字段,而是你乐观锁采用哪种机制,这里写成version意思就是采用版本判断这个机制,然后还要在主键id下面配置这个name后面跟的就是数据库中的字段名。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥100 求数学坐标画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站