ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 禁用TM全表锁

禁用TM全表锁

原创 Linux操作系统 作者:jcq0 时间:2010-08-13 10:11:33 0 删除 编辑

对于一个普通的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博客 ” ,链接:https://blog.itpub.net/14130873/viewspace-670912/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: 盘点2010展望2011
请登录后发表评论 登录
全部评论

注册时间:2008-11-25

  • 博文量
    93
  • 访问量
    367945