oracle資料庫事務transaction鎖lock模式思考之一

wisdomone1發表於2019-11-13

前言

        資料庫事務是oracle非常基礎又極為重要的概念。之前已經介紹過相關的一些概念,相關文章見下:  
  

oracle產生事務transaction幾種方式或方法  
oracle事務隔離級別transaction isolation level初識


      產生資料庫事務時,必然會在資料庫事務執行期間產生各種各樣的鎖。與鎖相關的動態效能檢視為v$lock,裡面有個列lmode,即持鎖模式或叫鎖模式,其具體含義及取值


鎖模式lmode可以有7種不同的取值,每個值到底是什麼意思,具體含義見下


鎖模式測試實踐

建立測試表並插入記錄

SQL> create table t_lockmode(a int,b int);
Table created.
SQL> insert into t_lockmode select 1,1 from dual;
1 row created.
SQL> commit;
Commit complete.



  • row share

這種鎖模式 允許 多個會話併發訪問被鎖定的表,但是不允許 其它會話以 exclusive排它模式鎖定整個表
這種鎖模式也是鎖模式 share update的同義詞
這種鎖模式仍然存在是為了相容 oracle舊版本
--未加鎖前的測試會話的持鎖資訊
(可見資料庫一直會持有各種鎖,下述的鎖是系統鎖,而非使用者鎖)
SQL> select addr,sid,type,lmode,request,block from v$lock where sid=73;
ADDR			SID TY	    LMODE    REQUEST	  BLOCK
---------------- ---------- -- ---------- ---------- ----------
000000008D2498B8	 73 AE		4	   0	      0
000000008D249AE8	 73 TO		3	   0	      0
--測試會話加 row share鎖模式
SQL> lock table t_lockmode in row share mode;
Table(s) Locked.
--加鎖模式 row share後的持鎖資訊
SQL> /
ADDR			SID TY	    LMODE    REQUEST	  BLOCK
---------------- ---------- -- ---------- ---------- ----------
000000008D2498B8	 73 AE		4	   0	      0
000000008D249AE8	 73 TO		3	   0	      0
00007FE54C209CD8	 73 TM		2	   0	      0  --lmode=2
---其它會話可以row share鎖模式併發訪問表
SQL> select sid from v$mystat where rownum=1;
       SID
----------
	28
SQL> lock table t_lockmode in row share mode;
Table(s) Locked.
SQL> rollback;
Rollback complete.
--其它會話可以 row exclusive鎖模式 併發訪問表
SQL> lock table t_lockmode in row exclusive mode;
Table(s) Locked.
SQL> rollback;
Rollback complete.
---其它會話可以share鎖模式併發訪問表
SQL> lock table t_lockmode in share mode;
Table(s) Locked.
SQL> rollback;
Rollback complete.
----其它會話可以 share row exclusive鎖模式併發訪問表
SQL> lock table t_lockmode in share row exclusive mode;
Table(s) Locked.
SQL> rollback;
Rollback complete.
----其它會話不能以 exclusive鎖模式併發訪問表
--卡住
SQL> lock table t_lockmode in exclusive mode;
SQL> /
ADDR			SID TY	    LMODE    REQUEST	  BLOCK
---------------- ---------- -- ---------- ---------- ----------
000000008D2498B8	 73 AE		4	   0	      0
000000008D249AE8	 73 TO		3	   0	      0
00007FE54C2042E0	 73 TM		2	   0	      1


  • row exclusive

這種鎖模式 同於row share,但是不允許其它會話以 share鎖模式訪問
這種鎖模式 在執行DML操作(update,insert,delete)會自動獲取這種鎖模式
測試會話以row exclusive鎖模式持有表
SQL> lock table t_lockmode in row exclusive mode;
Table(s) Locked.
SQL> select addr,sid,type,lmode,request,block from v$lock where sid=73;
ADDR			SID TY	    LMODE    REQUEST	  BLOCK
---------------- ---------- -- ---------- ---------- ----------
000000008D2498B8	 73 AE		4	   0	      0
000000008D249AE8	 73 TO		3	   0	      0
00007FE54C2042E0	 73 TM		3	   0	      0  --lmode=3
--其它會話可以row share鎖模式 併發訪問表
SQL> lock table t_lockmode in row share mode;
Table(s) Locked.
SQL> rollback;
Rollback complete.
--其它會話可以 row exclusive鎖模式 併發訪問表
SQL> lock table t_lockmode in row exclusive mode;
Table(s) Locked.
SQL> rollback;
Rollback complete.
--其它會話 不能以share鎖模式 併發訪問表
--卡住
SQL> lock table t_lockmode in share mode;
^Clock table t_lockmode in share mode
           *
ERROR at line 1:
ORA-01013: user requested cancel of current operation
--其它會話 不能以share row exclusive鎖模式 併發訪問表
SQL> lock table t_lockmode in share row exclusive mode;
^Clock table t_lockmode in share row exclusive mode
*
ERROR at line 1:
ORA-01013: user requested cancel of current operation
--其它會話 不能以exclusive鎖模式 併發訪問表
SQL> lock table t_lockmode in exclusive mode;
^Clock table t_lockmode in exclusive mode
           *
ERROR at line 1:
ORA-01013: user requested cancel of current operation


  • share

這種鎖模式 允許 多個會話併發查詢,但是不允許 對於鎖定表的update操作
測試會話以share鎖模式持有表
SQL> lock table t_lockmode in share mode;
Table(s) Locked.
SQL> select addr,sid,type,lmode,request,block from v$lock where sid=73;
ADDR			SID TY	    LMODE    REQUEST	  BLOCK
---------------- ---------- -- ---------- ---------- ----------
000000008D2498B8	 73 AE		4	   0	      0
000000008D249AE8	 73 TO		3	   0	      0
00007FE54C209CD8	 73 TM		4	   0	      0  --lmode=4
--其它會話可以row share鎖模式 併發訪問表
SQL>  lock table t_lockmode in row share mode;
Table(s) Locked.
SQL> rollback;
Rollback complete.
--其它會話不能以 row exclusive鎖模式 併發訪問表
SQL> lock table t_lockmode in row exclusive mode;
^Clock table t_lockmode in row exclusive mode
*
ERROR at line 1:
ORA-01013: user requested cancel of current operation
--其它會話可以 share鎖模式 併發訪問表
SQL> lock table t_lockmode in share mode;
Table(s) Locked.
SQL> rollback;
Rollback complete.
---其它會話 不允許以 share row exclusive鎖模式 併發訪問表
SQL> lock table t_lockmode in share row exclusive mode;
^Clock table t_lockmode in share row exclusive mode
*
ERROR at line 1:
ORA-01013: user requested cancel of current operation
---其它會話 不允許以 exclusive鎖模式 併發訪問表
SQL>  lock table t_lockmode in  exclusive mode;
^C lock table t_lockmode in  exclusive mode
*
ERROR at line 1:
ORA-01013: user requested cancel of current operation


  • share row exclusive

這種鎖模式 用於檢視整個表,允許 其它會話檢視錶的資料,但是不允許其它會話 以share鎖模式獲取表 ,也不允許 其它會話update被鎖定表
這種鎖模式 允許 對於鎖定表的查詢,但不允許 對於鎖定表的其它任何操作
測試會話以 share row exclusive鎖模式持有表
SQL> lock table t_lockmode in share row exclusive mode;
Table(s) Locked.
SQL> /
ADDR			SID TY	    LMODE    REQUEST	  BLOCK
---------------- ---------- -- ---------- ---------- ----------
000000008D2498B8	 73 AE		4	   0	      0
000000008D249AE8	 73 TO		3	   0	      0
00007FE54C209CD8	 73 TM		5	   0	      0
--其它會話 允許 以row share鎖模式 併發訪問表
SQL> lock table t_lockmode in row share mode;
Table(s) Locked.
SQL> rollback;
Rollback complete.
--其它會話 不允許 以row exclusive鎖模式 併發訪問表
SQL> lock table t_lockmode in row exclusive mode;
^Clock table t_lockmode in row exclusive mode
*
ERROR at line 1:
ORA-01013: user requested cancel of current operation
---其它會話 不允許 以share鎖模式 併發訪問表
SQL> lock table t_lockmode in  share mode;
^Clock table t_lockmode in  share mode
*
ERROR at line 1:
ORA-01013: user requested cancel of current operation
---其它會話 不允許 以share row exclusive鎖模式 併發訪問表
SQL> lock table t_lockmode in share row exclusive mode;
^Clock table t_lockmode in share row exclusive mode
*
ERROR at line 1:
ORA-01013: user requested cancel of current operation
---其它會話 不允許以 exclusive鎖模式 併發訪問表
SQL> lock table t_lockmode in exclusive mode;
^Clock table t_lockmode in exclusive mode
*
ERROR at line 1:
ORA-01013: user requested cancel of current operation



  • exclusive

這種鎖模式 允許 對於鎖定表的查詢,但不允許 對於鎖定表的其它任何操作
--測試會話以  exclusive鎖模式持有表
SQL> lock table t_lockmode in exclusive mode;
Table(s) Locked.
SQL> /
ADDR			SID TY	    LMODE    REQUEST	  BLOCK
---------------- ---------- -- ---------- ---------- ----------
000000008D2498B8	 73 AE		4	   0	      0
000000008D249AE8	 73 TO		3	   0	      0
00007FE54C2042E0	 73 TM		6	   0	      0  --lmode=6
--其它會話 不允許以 row share鎖模式 併發訪問表
SQL> lock table t_lockmode in row share mode;
^Clock table t_lockmode in row share mode
*
ERROR at line 1:
ORA-01013: user requested cancel of current operation
---其它會話不允許 以row exclusive鎖模式 併發訪問表
SQL> lock table t_lockmode in row exclusive mode;
^Clock table t_lockmode in row exclusive mode
*
ERROR at line 1:
ORA-01013: user requested cancel of current operation
---其它會話不允許以 share鎖模式 併發訪問表
SQL> lock table t_lockmode in share mode;
^Clock table t_lockmode in share mode
*
ERROR at line 1:
ORA-01013: user requested cancel of current operation
---其它會話不允許 以share row exclusive鎖模式 併發訪問表
SQL> lock table t_lockmode in share row exclusive mode;
^Clock table t_lockmode in share row exclusive mode
*
ERROR at line 1:
ORA-01013: user requested cancel of current operation
--其它會話不允許 以exclusive鎖模式 併發訪問表
SQL> lock table t_lockmode in exclusive mode;
^Clock table t_lockmode in exclusive mode
*
ERROR at line 1:
ORA-01013: user requested cancel of current operation


鎖模式之間的的相容性圖


小結

  • exclusive鎖模式最牛逼,它是唯我獨尊,獨對排它訪問,它一佔用表鎖資源,其它會話只能等待

  • row share(share update)鎖模式相對而言最溫和,它基本和所有的鎖模式可以並存,只是不允許exclusive鎖模式

  • share row exclusive鎖模式雖然沒有exclusive鎖模式這麼牛逼,它可以排第二種嚴厲鎖模式,它只能相容row share(share update)鎖模式

  • row exclusive及share鎖模式排位在share row exclusive之後,它可以相容3種鎖模式,不相容餘下2種鎖模式


培訓課件

(收費20元)

oracle資料庫事務transaction鎖lock模式思考之一

oracle資料庫事務transaction鎖lock模式思考之一

聯絡方式

oracle資料庫事務transaction鎖lock模式思考之一

oracle資料庫事務transaction鎖lock模式思考之一


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

相關文章