zoukankan      html  css  js  c++  java
  • 如何利用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字段是否一致,如果不一致就不让进行更新,如果一致就进行更新

  • 相关阅读:
    CF1442E. Black, White and Grey Tree
    CF1442D. Sum
    CF1444D. Rectangular Polyline
    arc107F
    外心与垂心关系
    CF1434E. A Convex Game
    CF1434D. Roads and Ramen
    arc106E
    arc106F
    CF704E. Iron Man
  • 原文地址:https://www.cnblogs.com/zyh1994/p/5493141.html
Copyright © 2011-2022 走看看