对于一个普通的dml操作,一般会先对表加TM全表锁,然后加TX锁。
当然,对于drop table,普通的create index都会对表加TM锁。
而对于全表锁的个数是由参数DML_LOCKS决定的。
1.dml_locks是一个衍生参数
默认情况下dml_locks=4*transactions
JCQ0> show parameter dml
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
dml_locks integer 748
JCQ0> show parameter tran
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
star_transformation_enabled string FALSE
transactions integer 187
transactions_per_rollback_segment integer 5
2.默认情况下,对于普通的事务需要获得TM和TX锁
JCQ0> conn jcq0/jcq0
已连接。
JCQ0> update test set id=6 where id=5;
已更新 1 行。
JCQ0>
--另外一个session
/*
JCQ0> conn / as sysdba
已连接。
JCQ0> select type from v$lock where sid=159;
TY
--
TM
TX
*/
3.dml_locks是一个静态参数
JCQ0> alter system set dml_locks=0;
alter system set dml_locks=0
*
第 1 行出现错误:
ORA-02095: 无法修改指定的初始化参数
4.修改dml_locks=0
JCQ0> show parameter spfile
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string
JCQ0> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
--修改参数文件加入dml_locks=0
JCQ0> startup
ORACLE 例程已经启动。
Total System Global Area 314572800 bytes
Fixed Size 1248720 bytes
Variable Size 71303728 bytes
Database Buffers 234881024 bytes
Redo Buffers 7139328 bytes
数据库装载完毕。
数据库已经打开。
JCQ0> show parameter dml
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
dml_locks integer 0
5.再次执行dml操作,将看不到TM锁
JCQ0> conn jcq0/jcq0
已连接。
JCQ0> update test set id=5 where id=3;
已更新 1 行。
/*
JCQ0> select type from v$lock where sid=159;
TY
--
TX
*/
6.禁用的TM锁之后对其他语句的影响
禁用TM锁之后所有需要获得全表锁的语句都会受到影响
JCQ0> conn jcq0/jcq0
已连接。
JCQ0> drop table test10;
drop table test10
*
第 1 行出现错误:
ORA-00062: 无法获得 DML 全表锁定; DML_LOCKS 为 0
JCQ0> create index test_idx on test(id);
create index test_idx on test(id)
*
第 1 行出现错误:
ORA-00062: 无法获得 DML 全表锁定; DML_LOCKS 为 0
JCQ0> lock table test in exclusive mode;
lock table test in exclusive mode
*
第 1 行出现错误:
ORA-00062: 无法获得 DML 全表锁定; DML_LOCKS 为 0
7.其他的实现禁用表锁的方式
JCQ0> alter table test disable table lock;
表已更改。
JCQ0> alter table test enable table lock;
表已更改。
JCQ0>
在一个TM enquene 严重的系统中,禁用TM锁可以大大的提高系统的性能,但是也需留意禁用TM锁之后的限制。
(需要引用, 请注明出处:痴情甲骨文http://space.itpub.net/14130873)
-------------------------------------------------------------------------------------------------
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14130873/viewspace-670912/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/14130873/viewspace-670912/