乐观锁和悲观锁

2017-11-05  本文已影响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 

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

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

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

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

上一篇下一篇

猜你喜欢

热点阅读