通過10046分析v$lock持鎖模式lmode之系列四
背景
在之前文章:http://blog.itpub.net/9240380/viewspace-1816522/
學習了v$lock.lmode不同持鎖模式的基本區別,本文準備從實際操作角度來理解下不同持鎖模式的區別,便於大家從直觀感覺ORACLE 不同鎖模式的差異,
我們準備採用大家熟知的10046進行分析。
結論
10046分析我們採用oredebug工具執行10046,因為ORADEBUG使用非常方便,關於如何在ORADEBUG中使用10046,請見測試之1,先看下SELECT查詢部分
1,所有結論基於10046
2,select查詢不加任何鎖
3,dml即insert,update,delete不加任何鎖
4,ddl之alter table add會對測試表新增行級排它鎖
5,ddl之truncate table會對測試表及sys使用者下的mon_mods$基本加表級排它鎖
6,ddl之drop table不加任何鎖
7,ddl之alter table modify會對測試表新增表級排它鎖
8,可見alter table move會對測試表新增表級排它鎖
9,可見收集表統計資訊沒有加鎖資訊
10,可見alter table validate structure會對測試表新增表級共享鎖
當然還有一些其它的各種DDL操作沒有測試,不過從這些測試中,有幾點體會
1,10046可以從底層檢視或分析對錶SELECT及DML及DDL持鎖情況
2, 有些DDL操作會自動產生lock table持鎖模式,而有些ddl卻不會
3, 如果在高併發的OLTP環境,在業務高峰期間嚴禁truncate table
alter table modify
alter table move
4,進一步加深了對於持鎖模式v$lock.lmode的理解
5,再強調一點,10046是利器,還要要更多使用,發揮其作用
6,本文最大價值在於,感覺作ORACLE DBA一定要全面細心,具體一點就是同樣的命令,但採用不同的選項及引數,在高併發環境下產生的持鎖模式是不一樣,
而不同的持鎖模式,會對併發操作造成不同的影響,所以一定要詳細測試,充分測試,理解不同選項的區別
測試
1,先看下select查詢
SQL> select * from v$version where rownum=1;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
會話2
SQL> select pid,spid from v$process where addr=(select paddr from v$session where sid=(select sid from v$mystat where rownum=1));
PID SPID
---------- ------------------------------------------------
182 1095
SQL> create table t_everylock(a int,b int);
Table created.
SQL> insert into t_everylock values(1,1);
1 row created.
SQL> commit;
Commit complete.
會話1
SQL> show user
USER is "SYS"
SQL> oradebug setospid 1095
Oracle pid: 182, Unix process pid: 1095, image: oracle@seconary (TNS V1-V3)
SQL>
SQL> oradebug event 10046 trace name context forever,level 12
Statement processed.
SQL> oradebug unlimit
Statement processed.
會話2
SQL> select * from t_everylock;
A B
---------- ----------
1 1
會話1
SQL> oradebug event 10046 trace name context off
Statement processed.
SQL> oradebug tracefile_name
/oracle/diag/rdbms/guowang/guowang/trace/guowang_ora_1095.trc
檢視select查詢生成的TRC檔案,未發現加鎖的資訊
PARSING IN CURSOR #4 len=25 dep=0 uid=84 oct=3 lid=84 tim=1446041227662326 hv=3732875905 ad='cf9b5688' sqlid='bj1a2kvg7yan1'
select * from t_everylock
END OF STMT
2,再看下insert插入
--略去無關內容
SQL> insert into t_everylock values(2,2);
insert插入生成的TRC檔案,沒有看到加鎖的資訊
3,再看下update更新
SQL> update t_everylock set a=2 where a=1;
1 row updated.
update生成的TRC檔案,沒有看到加鎖的資訊
4,繼續看delete
delete插入生成的TRC檔案,沒有看到加鎖的資訊
5,檢視select for update
select for update生成的TRC檔案,沒有看到加鎖的資訊
6,檢視truncate table
[oracle@seconary ~]$ more /oracle/diag/rdbms/guowang/guowang/trace/guowang_ora_28030.trc|grep -i --color "lock table"
LOCK TABLE "T_EVERYLOCK" IN EXCLUSIVE MODE NOWAIT
lock table sys.mon_mods$ in exclusive mode nowait
truncate table期間會對測試表及sys使用者下的mon_mods$基本加表級排它鎖
7,檢視alter table add
[oracle@seconary ~]$ more /oracle/diag/rdbms/guowang/guowang/trace/guowang_ora_31544.trc|grep -i --color "lock table"
LOCK TABLE "T_EVERYLOCK" IN ROW EXCLUSIVE MODE NOWAIT
[oracle@seconary ~]$
可見alter table其間會對測試表新增行級排它鎖
8,檢視drop table
可見drop table期間未加任何鎖
9,檢視alter table modify(表中已有資料)
LOCK TABLE "T_EVERYLOCK" IN EXCLUSIVE MODE NOWAIT
可見alter table modify會對測試表新增表級排它鎖
10,檢視dbms_stat.gather_table_stats
可見收集表統計資訊沒有加鎖資訊
11,檢視alter table move
LOCK TABLE "T_EVERYLOCK" IN EXCLUSIVE MODE NOWAIT
可見alter table move會對測試表新增表級排它鎖
12,檢視analyze table validate structure
LOCK TABLE "T_EVERYLOCK" IN SHARE MODE NOWAIT
可見alter table validate structure會對測試表新增表級共享鎖
個人簡介:
8年oracle從業經驗,具備豐富的oracle技能,目前在國內北京某專業oracle服務公司從事高階技術顧問。
服務過的客戶:
中國電信
中國移動
中國聯通
中國電通
國家電網
四川達州商業銀行
湖南老百姓大藥房
山西省公安廳
中國郵政
北京302醫院
河北廊坊新奧集團公司
專案經驗:
中國電信3G專案AAA系統資料庫部署及優化
中國聯通CRM資料庫效能優化
中國移動10086電商平臺資料庫部署及優化
湖南老百姓大藥房ERR資料庫sql優化專案
四川達州商業銀行TCBS核心業務系統資料庫模型設計和RAC部署及優化
四川達州商業銀行TCBS核心業務系統後端批處理儲存過程功能模組編寫及優化
北京高鐵訊號監控系統RAC資料庫部署及優化
河南宇通客車資料庫效能優化
中國電信電商平臺核心採購模組表模型設計及優化
中國郵政儲蓄系統資料庫效能優化及sql優化
北京302醫院資料庫遷移實施
河北廊坊新奧data guard部署及優化
山西公安廳身份證審計資料庫系統故障評估
聯絡方式:
手機:18201115468
qq : 305076427
qq微博: wisdomone1
新浪微博:wisdomone9
qq群:275813900
itpub部落格名稱:wisdomone1 http://blog.itpub.net/9240380/
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9240380/viewspace-1816849/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 基於v$lock.lmode分析父子表外來鍵列是否索引持鎖模式區別之系列六索引模式
- 通過dump library cache分析與學習oracle易碎解析鎖v$lock之系列十Oracle
- oracle lock鎖_v$lock_轉Oracle
- 通過DBMS_LOCK.SLEEP實現SQL對V$檢視進行持續取樣SQL
- MySQL鎖系列(四)之undologMySql
- 通過11G的V$SESSION來分析鎖阻塞關係Session
- 結合ReentrantLock獲得鎖分析AQS,lock過程分析ReentrantLockAQS
- MySQL-lock(鎖)-v2.0MySql
- 從V$LOCK裡面看到的lmode就是我們能從資料字典裡,能看到的所有的鎖型別--轉型別
- oracle v$lock系列之三Oracle
- TX鎖(Transaction Lock)分析 (zt)
- mysql innodb lock鎖之record lock之一MySql
- 深入理解Java併發框架AQS系列(四):共享鎖(Shared Lock)Java框架AQS
- Oracle LOCK內部機制及最佳實踐系列(二)模擬RI鎖定導致阻塞的場景,並分析v$lockOracle
- Spring Security系列之核心過濾器原始碼分析(四)Spring過濾器原始碼
- 使用oracle 10704 event分析獲取鎖lock及死鎖deadlock系列九Oracle
- select for update_v$lock_dml小測試(鎖型別及模式)型別模式
- 基於v$lock.block及request及dba_waiters或dba_blockers學習lock鎖系列七BloCAI
- oracle鎖表問題處理 v$lock v$locked_objectOracleObject
- 併發程式設計系列之Lock鎖可重入性與公平性程式設計
- Lock的獨佔鎖和共享鎖的比較分析
- 通過MySQL儲存原理來分析排序和鎖MySql排序
- v$session之小測試(一)_與v$lockSession
- oralce之 10046對Hash Join分析
- oracle lock dba_ddl_locks獲取表級共享鎖及表級排它鎖之系列八Oracle
- mysql metadata lock後設資料鎖之鎖狀態lock_status流轉圖MySql
- 基於oracle11g生成systemstate dump檔案分析持鎖會話有等待鎖會話及閂latch之系列三Oracle會話
- 通過10046與tkprof瞭解SQL執行SQL
- JAVA物件分析之偏向鎖、輕量級鎖、重量級鎖升級過程Java物件
- v$lock之alter table drop column與alter table set unused column區別系列五
- oracle lock轉換及oracle deadlock死鎖系列一Oracle
- Oracle LOCK內部機制及最佳實踐系列(四)深入分析mode 2-6 的TM鎖相互間的互斥關係Oracle
- ffmpeg分析系列之四(探測輸入的格式)
- 如何通過OEM中的Lock資訊查詢Lock哪一行
- lock鎖和monitor.enter鎖
- 【MySQL】死鎖案例之四MySql
- oracle 11g latch之v$latch和systemstate dump檔案之系列四Oracle
- 通過Docker容器執行持續整合/持續部署Docker