zoukankan      html  css  js  c++  java
  • 悲观锁和乐观锁详解

    ===========
    悲观锁
    ===========
    悲观锁是指假设并发更新冲突会发生,所以不管冲突是否真的发生,都会使用锁机制。
    悲观锁会完成以下功能:锁住读取的记录,防止其它事务读取和更新这些记录。其它事务会一直阻塞,直到这个事务结束。
    悲观锁是在使用了数据库的事务隔离功能的基础上,独享占用的资源,以此保证读取数据一致性,避免修改丢失。
    悲观锁可以使用Repeatable Read事务,它完全满足悲观锁的要求。

    ===========
    乐观锁
    ===========
    乐观锁不会锁住任何东西,也就是说,它不依赖数据库的事务机制,乐观锁完全是应用系统层面的东西
    如果使用乐观锁,那么数据库就必须加版本字段,否则就只能比较所有字段,但因为浮点类型不能比较,所以实际上没有版本字段是不可行的。

    【两个事务,先提交的有效,后提交就会报错】

    1、在 domain对象中添加一个字段:
    private Integer ver;
    public void setVer(Integer ver){
    this.ver = ver;
    }
    public Integer getVer(){
    return this.ver;
    }

    2、在 映射文件 *.hbm.xml 中添加:
    <version name="ver" type="integer"/> -- 版本号方法
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    ++++也可以使用时间戳
    private Timesta ver;
    <version name="ver" type="timestamp"/>
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    3、即可

    ---------------------------------------------------------------------------
    Transaction tx1 = s1.beginTransaction();
    User u1 = (User)s1.get(User.class, id);

    Transaction tx2 = s2.beginTransaction();
    User u2 = (User)s2.get(User.class, id);

    //修改
    u1.setName("itao1");
    u2.setName("itao2");

    tx2.commit(); --成功 【提交时 先判断 u1对象中的 ver值 和 数据库中对应记录的ver值是否一样,一样就修改成功,然后 把对应记录的ver+1】
    tx1.commit(); --报错 【也是先判断 由于u1修改时,使得数据库中对应记录的ver值比u2对象中的ver值大1,所以保存失败】

    ---------------------------------------------------------------------------

  • 相关阅读:
    扩展LVM 逻辑卷存储空间
    Linux Shell远程执行命令(命令行与脚本方式)
    vsftpd FTP服务器配置
    初识小米Minos
    使用Libpng库实现Tiny6410显示PNG图片
    uCos-II内存管理
    应用程序调用tslib出现segmentation fault
    Linux-2.6.39在Tiny6410上的移植
    Linux-2.6.39在Tiny6410上的移植
    Tiny6410移植tslib
  • 原文地址:https://www.cnblogs.com/qintangtao/p/2744791.html
Copyright © 2011-2022 走看看