背景
lock锁不止有DML锁,也有DDL锁,之前已经学习了诸多锁的知识与概念,现在我们学习DDL锁,力图更为全面了解ORACLE锁的知识体系,如此运维过程中方可稳中有胜。结论
1,通过dba_ddl_locks可以获取ddl锁的信息
2,使用select session_id,owner,name,type,mode_held,mode_requested from dba_ddl_locks where session_id in (174,332) and owner='SCOTT';
查询DDL锁的占用情况
,其包括信息如:会话,资源的所有者,资源名称,资源类型,持锁模式,请求锁模式
3,必须同时启用2个创建或编译引用相同表的存储过程,才会产生对于引用表的表级共享锁
4,alter table add持行级排它锁
alter table add default持表级排它锁
也就是说alter table不同选项的持锁模大有差异
在生产环境,建议更多采用alter table add default,当然最终在生产环境,也要结合你的实际需求
引发出的新问题
1,oracle lock机制还没有完全搞通,搞懂,还要在实战中继续思考2,oracle在不同版本锁机制的演化,当然这个很高级了,慢慢来吧
测试
SQL> select * from v$version where rownum=1;
BANNER
---------------------------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
SQL> show user
USER is "SCOTT"
SQL> alter session set current_schema=scott;
Session altered.
SQL> grant dba to scott;
Grant succeeded.
1,先看下DDL排它锁
SQL> create table t_create(a int);
Table created.
可见create table不持任何锁
SQL> alter table t_create add b int;
Table altered.
LOCK TABLE "T_CREATE" IN ROW EXCLUSIVE MODE NOWAIT
可见alter table add持行级排它锁
SQL> alter table t_create add b int default 0;
Table altered.
LOCK TABLE "T_CREATE" IN EXCLUSIVE MODE NOWAIT
可见alter table add default持表级排它锁,可见alter table add如果选项不同,持锁模式大有不同哟
2,再看下DDL共享锁
创建存储过程
SQL> create or replace procedure proc_t_create1
2 as
3 v_cnt pls_integer;
4 begin
5 select count(a) into v_cnt from t_create;
6 end;
7 /
Procedure created.
没有持任何锁
SQL> alter procedure proc_t_create1 compile;
Procedure altered.
没有持任何锁
转换思路,向测试表插入大量数据
SQL> insert into t_create select level,level from dual connect by level<=1000000;
1000000 rows created.
SQL> commit;
Commit complete.
经过测试,仍未发现持任何锁
再换一种思路,重读官方手册,发现是必须要2个会话以上创建或编译引用相同基表的存储过程,才会持表级共享锁
新开一个会话,也创建另一个引用测试的存储过程
SQL> select sid from v$mystat where rownum=1;
SID
----------
332
create or replace procedure proc_t_create2
as
v_cnt pls_integer;
begin
select count(a) into v_cnt from t_create;
end;
/
会产生332会话的对于引用表的表级共级锁(而且这个持锁时间极短,非常快)
SQL> select session_id,owner,name,type,mode_held,mode_requested from dba_ddl_locks where session_id in (174,332) and owner='SCOTT';
SESSION_ID OWNER NAME TYPE MODE_HELD MODE_REQUESTED
---------- --------------- -------------------- ------------------------------ ------------------ ------------------
332 SCOTT PROC_T_CREATE2 Table/Procedure/Type Exclusive None
332 SCOTT T_CREATE Table/Procedure/Type Share None
332 SCOTT T_CREATE Table/Procedure/Type Share None
332 SCOTT SCOTT 18 Null None
个人简介:
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-1819302/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/9240380/viewspace-1819302/