zoukankan      html  css  js  c++  java
  • Hibernate 悲观锁(Pessimistic Locking)

      在日常开发中并发应该是比较常遇到的业务场景,Hibernate给我们提供了并发操作,接下来简单介绍一下Hibernate悲观控制。

      悲观锁:用户其实并不需要花很多精力去担心锁定策略的问题,通常情况下,只要为JDBC连接指定一下隔离级别,然后让数据库去搞定一切就够了。人儿,高级用户有时候希望进行一个排他的悲观锁定,或者在一个新的事物启动的时候进行锁定。

      数据库隔离级别:

        ①没有并发控制

          存在的问题:更新遗失。 
          解决办法就是下面的“可读取未确认”。

        ②可读取未确认(Read uncommitted)

          写事务阻止其他写事务,避免了更新遗失。但是没有阻止其他读事务。 
          存在的问题:脏读。即读取到不正确的数据,因为另一个事务可能还没提交最终数据,这个读事务就读取了中途的数据,这个数据可能是不正确的。 
          解决办法就是下面的“可读取确认”。

        ③可读取确认(Read committed)

          写事务会阻止其他读写事务。读事务不会阻止其他任何事务。 
          存在的问题:不可重复读。即在一次事务之间,进行了两次读取,但是结果不一样,可能第一次id为1的人叫“李三”,第二次读id为1的人就叫了“李四”。因为读取操作不会阻止其他事务。 
          解决办法就是下面的“可重复读”。

        ④可重复读(Repeatable read)

          读事务会阻止其他写事务,但是不会阻止其他读事务。 
          存在的问题:幻读。可重复读阻止的写事务包括update和delete(只给存在的表加上了锁),但是不包括insert(新行不存在,所以没有办法加锁),所以一个事务第一次读取可能读取到了10条记录,但是第二次可能读取到11条,这就是幻读。 
          解决办法就是下面的“串行化”。

        ⑤可串行化(Serializable)

          读加共享锁,写加排他锁。这样读取事务可以并发,但是读写,写写事务之间都是互斥的,基本上就是一个个执行事务,所以叫串行化。

      类LockOptions定义了Hibernate所需要的不同的锁定级别。一个锁定可以通过以下的机制来设置:

        ①LockOptions.UPGRADE 更新

        ②LockOptions.NO_WAIT 不等待

        ③LockOptions.NONE 不上锁

        ④LockOptions.WAIT_FOREVER 写

        ⑤LockOptions.READ 读

      悲观锁主要是解决操作数据时禁止其他人访问的业务问题。

  • 相关阅读:
    MetaMask/metamask-extension-provider
    MetaMask/json-rpc-engine
    MetaMask/json-rpc-middleware-stream
    DamonOehlman/detect-browser
    kumavis/obj-multiplex
    java面试第三天
    java面试第二天
    JavaScript公共函数
    Eclipse快捷键大全
    Jdbc入门
  • 原文地址:https://www.cnblogs.com/wuyx/p/8519691.html
Copyright © 2011-2022 走看看