悲观锁与乐观锁的定义:
悲观锁,顾名思义,就是悲观,每次认为去取数据的时候别人都会修改,因此每次去取数据的时候都会进行上锁。也即是说,如果某个事务执行操作应用了锁, 那么只有等这个事务释放了锁,其他事务才能操作该数据。
乐观锁,顾名思义,每次都很乐观,认为去取数
据的时候,别人不会修改数据, 只有当修改提交更新的时候,才会对数据进行冲突与否检测,当数据发生冲突时候,会返回用户错误信息,让用户决定如何去做。
悲观锁,乐观锁的使用:
看个乐观锁的应用:
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
只有当该事物释放锁之后才能进行其他事务操作。
悲观锁和乐观锁的优缺点:
悲观锁是先取锁然后再访问, 对数据安全性有了保证, 但是在效率方面,加锁会产生额外的开销,并且增加了死锁的机会。;对于只读事务,没必须对数据加锁,使用悲观锁会加重负载;并且对于高并发系统,如果 使用悲观锁,当一个事物获得锁,其他事务必须等待,这样降低了事务的并行性。
乐观锁是 孔祥重教授提出来的,是基于数据竞争的概率比较小,可以尽可能的做下去只是在提交时才锁定,因此不会造成死锁,但是当两个事务都是读取同一行数据,经修改后,写回数据库,那么这时就会抛出异常。
网友评论