如何利用hibernate3解决数据库丢失更新问题?

首先我们要明白什么叫丢失更新。

比如数据库有一个person表,里面有一条这样的数据 "5 zhangsan shenzhen";

现在有两个事务A、B同时查找了这一条记录;

A事务修改记录为"5 zhangsan beijing";

提交事务

B事务修改记录为"5 lisi shenzhen";

这时候B事务再去提交或者回滚数据就会出现覆盖A事务已经修改的内容,这种情况就叫做丢失更新。

hibernate3中的解决方法:利用悲观锁、乐观锁

悲观锁:底层原理就是利用了数据库中的for update;

    当数据库中select SQL语句上带有for update时,A事务能够查到信息,B在去查的时候就查不到信息,只有当A事务提交事务之后才能查到数据。

    在hibernate3中在获取数据时有提供get(Class arg0,Serializable arg1,LockMode arg3)方法,可以在获取数据时给定一个LockMode参数(LockMode.UPGRADE)

    一般不用,一般用乐观锁解决

乐观锁:

  1.在实体类添加一个属性字段,假如名字叫ver,名字可以随意起,并提供getset方法

  2.在对应的映射文件中添加<version name="ver"/>

  其它就照常写就行了,在hibernate提交事务时发送的sql是这样子

  update .... set ver=? .... where .... and version=?

  意思是说在提交事务的时候,hibernate框架会自动检查两次的ver字段是否一致,如果不一致就不让进行更新,如果一致就进行更新

时间: 2024-10-08 03:48:17

如何利用hibernate3解决数据库丢失更新问题?的相关文章

利用Memcache解决数据库高并发访问的瓶颈问题

转载:[转载请标明本文地址:http://www.jizhuomi.com/software/317.html] 对于高并发高访问的Web应用程序来说,数据库存取瓶颈一直是个令人头疼的问题.特别当你的程序架构还是建立在单数据库模式,而一个数据池连接数峰值已经达到500的时候,那你的程序运行离崩溃的边缘也不远了.很多小网站的开发人员一开始都将注意力放在了产品需求设计上,缺忽视了程序整体性能,可扩展性等方面的考虑,结果眼看着访问量一天天网上爬,可突然发现有一天网站因为访问量过大而崩溃了,到时候哭都来

利用Memcache解决数据库高并发访问的瓶颈问题【转】

对于高并发高访问的Web应用程序来说,数据库存取瓶颈一直是个令人头疼的问题.特别当你的程序架构还是建立在单数据库模式,而一个数据池连接数峰值已经达到500的时候,那你的程序运行离崩溃的边缘也不远了.很多小网站的开发人员一开始都将注意力放在了产品需求设计上,缺忽视了程序整体性能,可扩展性等方面的考虑,结果眼看着访问量一天天网上爬,可突然发现有一天网站因为访问量过大而崩溃了,到时候哭都来不及.所以我们一定要未雨绸缪,在数据库还没罢工前,想方设法给它减负,这也是这篇文章的主要议题. 大家都知道,当有一

利用反射插入数据库与更新数据库

public int Insert<T>(T m) where T : class { PropertyInfo[] pInfos = m.GetType().GetProperties(); FieldInfo[] fInfos = m.GetType().GetFields(); List<string> lstCol = new List<string>(); List<OleDbParameter> lstParam = new List<Ol

使用Source Safe for SQL Server解决数据库版本控制问题

简介 在软件开发过程中,版本控制是一个广为人知的概念.因为一个项目可能会需要不同角色人员的参与,通过使用版本控制软件,可以使得项目中不同角色的人并行参与到项目当中.源代码控制使得代码可以存在多个版本,而不会将代码库变得混乱,典型的场景包括Bug修复.添加新功能.版本整合等. 虽然在开发层面的版本控制软件已经非常成熟,但目前国内还没有专门针对数据库层面的版本控制软件来帮助不同角色的人员在数据库层面进行团队协作.变更代码管理以及对数据库的变更进行查看和比对.在数据库层面版本控制工具的缺乏可能会出现如

并发事务的丢失更新及数据锁机制

在事务的隔离级别内容中,能够了解到两个不同的事务在并发的时候可能会发生数据的影响.细心的话可以发现事务隔离级别章节中,脏读.不可重复读.幻读三个问题都是由事务A对数据进行修改.增加,事务B总是在做读操作.如果两事务都在对数据进行修改则会导致另外的问题:丢失更新.这是本博文所要叙述的主题,同时引出并发事务对数据修改的解决方案:锁机制. 1.丢失更新的定义及产生原因. 丢失更新就是两个不同的事务(或者Java程序线程)在某一时刻对同一数据进行读取后,先后进行修改.导致第一次操作数据丢失.可以用图表表

并发事务之丢失更新

7 并发事务问题之丢失更新 丢失更新:一个事务的更新被另一个事务的更新覆盖了: 时间点 事务1 事务2 t1? 开始事务 ? t2? ? 开始事务 t3? 查询pid=p1的记录结果为[pid=p1,pname=zhangSan,age=23,sex=male] ? t4 ? 查询pid=p1的记录结果为[pid=p1,pname=zhangSan,age=23,sex=male] t5? 修改age=24,其它保留原值,即: update person set pname='zhangSan'

Java程序中解决数据库超时与死锁

Java程序中解决数据库超时与死锁 2011-06-07 11:09 佚名 帮考网 字号:T | T Java程序中解决数据库超时与死锁,每个使用关系型数据库的程序都可能遇到数据死锁或不可用的情况,而这些情况需要在代码中编程来解决.本文主要介绍与数据库事务死锁等情况相关的重试逻辑概念. AD: Java程序中解决数据库超时与死锁,每个使用关系型数据库的程序都可能遇到数据死锁或不可用的情况,而这些情况需要在代码中编程来解决;本文主要介绍与数据库事务死锁等情况相关的重试逻辑概念,此外,还会探讨如何避

【DG】利用闪回数据库(flashback)修复Failover后的DG环境

利用闪回数据库(flashback)修复Failover后的DG环境 1.1  BLOG文档结构图 1.2  前言部分 1.2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① Failover后DG环境的恢复方法(重点) ② DG的基本维护操作 ③ GC客户端软件的安装 ④ 利用GC快速搭建一套DG环境 ⑤ Failover和Switchover的区别 ⑥ 其它维护操作 1.3  本文简介 10月23和24日考

利用 POCO 解决 Entity Framework 的默认值 (Default Value) 写入问题 v4

利用 POCO 解决 Entity Framework 的默认值 (Default Value) 写入问题 经过 6 小时的实践和验证后,原本文章 po 出来的作法,只有在小弟特定的项目和 UT? 才可以执行?? ( 原因尚不明 ) 小弟重新建置相同的程序和数据库后却无法重现同样的效果. 另外,虽然 很多文章在反应是 CSDL 有更新,但 SSDL 没有更新是 Bug . 但小弟导入 StoreGeneratedPattern = Computed 后,发现若是 SSDL 也改成 Compute