背景
在之前文章:
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/