转载

通过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/



正文到此结束
Loading...