为了得到最大的性能,一般数据库都有并发机制,随之而来的就是数据访问的冲突问题。为了解决这个问题,大部分数据库使用的办法就是数据库的锁定。数据库的锁分为两种,一种叫悲观锁(Pessimistic locking),另一种叫乐观锁(Optimistic lock)。
悲观锁就是对数据的冲突采取一种悲观的态度,假设数据肯定会冲突,所以在开始读取数据的时候就把数据锁定住。乐观锁就是认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才回正式对数据的冲突进行检测,如果发现冲突,则让用户返回错误信息,让用户去决定如何做。
实验
SQL> variable empno number
SQL> variable sal number
SQL> exec :empno :=7934;
PL/SQL 过程已成功完成。
SQL> variable ename varchar2(20)
SQL> exec :ename := 'MILLER';
PL/SQL 过程已成功完成。
SQL> exec :sal := 1300;
PL/SQL 过程已成功完成。
This approach is called pessimistic locking.
We lock the row before we attempt to update because we doubt-we are pessimistic –that the row wiil remain unchanged otherwise.
SQL> select
2 empno,ename,sal
3 from emp
4 where empno = :empno
5 and ename = :ename
6 and sal = :sal
7 for update nowait
8 /
---------- ---------- ----------
7934 MILLER 1300
此时在另一个session中执行
SQL> select * from emp for update nowait;
select * from emp for update nowait
*
ERROR 位于第 1 行:
ORA-00054: 资源正忙,要求指定 NOWAIT
会报ORA-00054的错误。
继续在原来的session下update
SQL> update emp
2 set ename = :ename,sal = :sal
3 where empno = :empno;
已更新 1 行。
SQL> commit;
提交完成。