悲观锁与乐观锁

悲观锁与乐观锁是我们在数据库编程时常常遇到的两个概念,现在凭我的理解解释下!(oracle为例)

字面解释:

所谓悲观锁是指,在使用更改数据之前认为数据有可能已经被修改,所以首先对要更新的数据行进行锁定。

所谓乐观锁是指,在使用更改数据之前认为数据没有更改。

一般形式:

select for update nowait --锁定查询行一般用于悲观锁

update set                    --oracle中的更新本身就具有锁的既能

举例:

更新emp表MILLER的名字和工资。

使用悲观锁实现:

  • 查询到Miller的相关信息,并将其锁定,以供更新使用
select empno, ename, sal from emp where empno = :empno
 and ename = :ename and sal = :sal for update nowait;
  • 更新数据信息
update emp set ename = :ename, sal = :sal where empno = :empno; 
  • 提交事务
commit;

 加锁后可能有以下几种情况发生:

  1. 基本数据没有更新,我们将获得Miller行,这一行将被锁定不能由其他人更新。
  2. 如果正巧另外一个人正在修个这条数据的过程当中,我们将获得"ORA-00054资源忙"的错误。我们被阻塞必须等待该用户完成工作并释放锁资源才能够再次利用。
  3. 在选择数据和指定更新意图的时间里,一个人已经更改了哪一行,那么我们将获得零行!

你可能感兴趣的:(oracle,编程,工作)