oracle資料庫事務transaction鎖lock模式思考之一
前言
資料庫事務是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元)
聯絡方式
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9240380/viewspace-2664018/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- oracle資料庫事務transaction 不同的鎖lock型別Oracle資料庫型別
- oracle事務transaction鎖lock一點兒小思考或總結Oracle
- oracle資料庫事務不同事務隔離級別與v$transaction flag列思考Oracle資料庫
- 分散式事務鎖模式之一:租用Lease分散式模式
- oracle資料庫事務transaction隔離級別isolation level的選擇依據Oracle資料庫
- [資料庫]--Transaction那點事兒資料庫
- mysql innodb lock鎖之record lock之一MySql
- MySQL(一):MySQL資料庫事務與鎖MySql資料庫
- DAPPER 事務 TRANSACTIONAPP
- indexedDB transaction 事務Index
- MySQL資料庫引擎、事務隔離級別、鎖MySql資料庫
- oracle事務隔離級別transaction isolation level初識Oracle
- MS SQL Server資料庫事務鎖機制分析(轉)SQLServer資料庫
- 資料庫篇:mysql事務原理之MVCC檢視+鎖資料庫MySqlMVC
- Sql Server 資料庫事務與鎖,同一事務更新又查詢鎖?期望大家來解惑SQLServer資料庫
- 關於資料庫事務和鎖的一些分析資料庫
- 效能優化之資料庫篇2-事務與鎖優化資料庫
- ORACLE基礎之oracle鎖(oracle lock mode)詳解Oracle
- 資料庫事務與 MySQL 事務總結資料庫MySql
- 說說資料庫事務資料庫
- 淺談資料庫事務資料庫
- 資料庫事務概論資料庫
- 資料庫事務的特徵資料庫特徵
- 資料庫事務以及事務的四個特性資料庫
- 資料庫事務耗時過長導致Could not retrieve transaction read-only status from server異常資料庫Server
- mysql metadata lock後設資料鎖之鎖狀態lock_status流轉圖MySql
- 資料庫主要物件及事務資料庫物件
- 資料庫事務入門指南資料庫
- Laravel 開啟資料庫事務Laravel資料庫
- MySQL資料庫本地事務原理MySql資料庫
- Springboot資料庫事務處理——Spring宣告式事務Spring Boot資料庫
- 資料庫事務與事務的隔離級別資料庫
- 分散式事務之資料庫事務與JDBC事務實現(一)分散式資料庫JDBC
- 從 Oracle 轉型 MySQL 分散式事務資料庫的實戰旅途OracleMySql分散式資料庫
- 2.8.1.3 Oracle特性資料庫服務Oracle資料庫
- 設定mysql 事務鎖超時時間 innodb_lock_wait_timeoutMySqlAI
- 重新學習MySQL資料庫6:淺談MySQL的中事務與鎖MySql資料庫
- MySQL資料庫事務各隔離級別加鎖情況--read uncommittMySql資料庫MIT