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字段是否一致,如果不一致就不让进行更新,如果一致就进行更新

  • 相关阅读:
    jQuery before 和 after
    pm2常用的命令
    git 常见命令
    Number 和 parseInt 区别
    枚举创建单例模式 安全 而且利用反射也读不到
    spring 的数据库工具类 JDBCTemplate
    阿里druid数据库连接及配置文件
    java C3P0连接数据库
    JDBC利用.properties文件连接数据库
    JDBC工具类的使用
  • 原文地址:https://www.cnblogs.com/zyh1994/p/5493141.html
Copyright © 2011-2022 走看看