oracle-- tom悲觀鎖演示

oracle_db發表於2012-04-20
環境Release 10.2.0.1.0

悲觀鎖定:在修改資料前就在資料上加鎖防止其它使用者同時更新資料
會話1:使用者1查詢一些資料,想從這些資料中找出要更改的,比如它想要更新EMPNO=7934這一條
SQL> select empno,ename,sal from emp where deptno=10;

     EMPNO ENAME             SAL
---------- ---------- ----------
      7782 CLARK            2450
      7839 KING             5000
      7934 MILLER           1300

會話2:在使用者1查詢後,更新前,使用者2的某個應用繫結了使用者1選擇的想要更新的資料,下面是模擬繫結
SQL> variable empno number
SQL> variable ename varchar2(20)
SQL> variable sal number
SQL> exec :empno:=7934;:ename:='MILLER';:sal:=1300;

PL/SQL procedure successfully completed.

會話2:會話2的應用執行了以下查詢,這使得會話2應用繫結變數中的值,然後重新從資料庫中查詢這一行,還鎖定了這一行,不讓其它會話更新這一行

SQL> select empno,ename,sal from emp where empno=:empno and ename =:ename and sal =:sal for update nowait
  2  /

     EMPNO ENAME             SAL
---------- ---------- ----------
      7934 MILLER           1300

SQL> 

會話1:假設會話1這個時候終於選好要更新那一行了,而且恰好就是EMPNO=7934這行,並執行更新操作。

SQL> update scott.emp set sal=1500 where ename='MILLER';

這個時候這條語句執行了,但是停在那不會出錯也不會說更新成功,直到會話2 COMMIT;


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15720542/viewspace-721813/,如需轉載,請註明出處,否則將追究法律責任。

相關文章