美文网首页
乐观锁和悲观锁

乐观锁和悲观锁

作者: 程序员财富自由之路 | 来源:发表于2017-11-05 14:48 被阅读19次

    悲观锁与乐观锁的定义:

    悲观锁,顾名思义,就是悲观,每次认为去取数据的时候别人都会修改,因此每次去取数据的时候都会进行上锁。也即是说,如果某个事务执行操作应用了锁, 那么只有等这个事务释放了锁,其他事务才能操作该数据。

       乐观锁,顾名思义,每次都很乐观,认为去取数

    据的时候,别人不会修改数据, 只有当修改提交更新的时候,才会对数据进行冲突与否检测,当数据发生冲突时候,会返回用户错误信息,让用户决定如何去做。

    悲观锁,乐观锁的使用:

    看个乐观锁的应用:

    int updatedRows = connectionFromHabibMarwan.createStatement()

    .executeUpdate("update items set release_date = current_date() + 10," +"  version = version + 1" +"where name = 'CTU Field Agent Report'" +" and version = 0");

    System.out.println("Rows updated by Habib Marwan: " +updatedRows);

    //这一行是很多Java框架进行乐观锁检测的方法,检测真正更新的记录数。

    if (updatedRows == 0) throw new OptimisticLockingException();

    上面可以看到乐观锁是提交更新时候才检测有没有数据冲突。

    看个悲观锁的应用:

    connectionFromJackBauer.setAutoCommit(false);

    //然后jack要修改这条记录,确保同时没有其他人访问

    connectionFromJackBauer.createStatement().execute("select * from items where " +"name = 'CTU Field Agent Report' for update");

    // TODO update the row, etc.

    System.out.println("Jack Bauer locked the row for any " +"other update");

    上面可以看到悲观锁select * form table  for upadate 

    只有当该事物释放锁之后才能进行其他事务操作。

    悲观锁和乐观锁的优缺点:

    悲观锁是先取锁然后再访问, 对数据安全性有了保证, 但是在效率方面,加锁会产生额外的开销,并且增加了死锁的机会。;对于只读事务,没必须对数据加锁,使用悲观锁会加重负载;并且对于高并发系统,如果  使用悲观锁,当一个事物获得锁,其他事务必须等待,这样降低了事务的并行性。

    乐观锁是 孔祥重教授提出来的,是基于数据竞争的概率比较小,可以尽可能的做下去只是在提交时才锁定,因此不会造成死锁,但是当两个事务都是读取同一行数据,经修改后,写回数据库,那么这时就会抛出异常。

    相关文章

      网友评论

          本文标题:乐观锁和悲观锁

          本文链接:https://www.haomeiwen.com/subject/lxwcmxtx.html