禁用TM全表锁

对于一个普通的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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值