create table t_test01(id int primary key, name varchar(20));
insert into t_test01(id, name) values(1, 'cheng');
select name,id from sysobjects where name='T_TEST01';
select TRX_ID,LTYPE,LMODE,BLOCKED,TABLE_ID,TID FROM v$lock where table_id='2607';
SQL> select name,id from sysobjects where name='T_TEST01';
---------- -------- -----------
used time: 10.913(ms). Execute id is 1603500.
SQL> select TRX_ID,LTYPE,LMODE,BLOCKED,TABLE_ID,TID FROM v$lock where table_id='2607';
LINEID TRX_ID LTYPE LMODE BLOCKED TABLE_ID TID
---------- -------------------- ------ ----- ----------- ----------- --------------------
1 1186554 OBJECT IS 0 2607 1186554
used time: 0.846(ms). Execute id is 1603503.
LINEID TRX_ID LTYPE LMODE BLOCKED TABLE_ID TID
---------- -------------------- ------ ----- ----------- ----------- --------------------
1 1186554 OBJECT IS 0 2607 1186554
2 1186554 OBJECT IX 0 2607 1186554
used time: 0.643(ms). Execute id is 1603504.
当多个事务同时试图向有主键或UNIQUE约束的表中插入相同的数据时,前一个事务未提交,后面的事务将被阻塞,直到前一个事务提交或回滚。
insert into t_test01(id, name) values(2, 'liu');
insert into t_test01(id, name) values(2, 'liu');
LINEID TRX_ID LTYPE LMODE BLOCKED TABLE_ID TID
---------- -------------------- ------ ----- ----------- ----------- --------------------
1 1187705 OBJECT IS 0 2607 1187705
2 1187705 OBJECT IX 0 2607 1187705
3 1187716 OBJECT IX 0 2607 1187716
4 1187716 TID X 1 2607 1187705
used time: 0.681(ms). Execute id is 1603513.
LINEID ID WAIT_FOR_ID WAIT_TIME THRD_ID
---------- -------------------- -------------------- ----------- -----------
如果会话1和会话2,insert不同的主键字段会生成什么锁。
select TRX_ID, LTYPE, LMODE, BLOCKED, TABLE_ID, TID from v$lock where blocked=1;
select sess_id,sql_text,trx_id,thrd_id from v$sessions where trx_id='1187716';
sp_close_session(140387456909800);
select TRX_ID, LTYPE, LMODE, BLOCKED, TABLE_ID, TID from v$lock where blocked=1;
select TRX_ID, LTYPE, LMODE, BLOCKED, TABLE_ID, TID
from v$lock where blocked=1;SQL> 2
LINEID TRX_ID LTYPE LMODE BLOCKED TABLE_ID TID
---------- -------------------- ----- ----- ----------- ----------- --------------------
1 1187716 TID X 1 2607 1188049
used time: 26.253(ms). Execute id is 1603523.
SQL> select sess_id,sql_text,trx_id,thrd_id from v$sessions where trx_id='1187716';
LINEID SESS_ID SQL_TEXT TRX_ID THRD_ID
---------- -------------------- -------------------------------------------------- -------------------- -----------
1 140387456909800 insert into t_test01(id, name) values(3, 'cheng'); 1187716 30364
used time: 290.158(ms). Execute id is 1603524.
SQL> sp_close_session(140387456909800);
used time: 65.781(ms). Execute id is 1603525.
SQL> select TRX_ID, LTYPE, LMODE, BLOCKED, TABLE_ID, TID from v$lock where blocked=1;
used time: 0.620(ms). Execute id is 1603528.
死锁包括两个或者多个已阻塞事务,它们之间形成了等待环,每个都等待其他事务释放锁。例如事务1给表T1上了排他锁,第二个事务给表T2上了排他锁,此时事务1请求T2的排他锁,就会处于等待状态,被阻塞。若此时T2再请求表T1的排他锁,则T2也处于阻塞状态。
create table t1(id int primary key,name varchar(20));
insert into t1(id,name) values(1,'t1');
create table t2(id int primary key,name varchar(20));
insert into t2(id,name) values(1,'t1');
insert into t2(id,name) values(1,'t1');
insert into t1(id,name) values(1,'t1');
LINEID ID WAIT_FOR_ID WAIT_TIME THRD_ID
---------- -------------------- -------------------- ----------- -----------
1 1318466 1318491 325755 31473
used time: 0.353(ms). Execute id is 1862503.
SQL> select sess_id,sql_text,trx_id,thrd_id from v$sessions where trx_id='1318491';
LINEID SESS_ID SQL_TEXT TRX_ID THRD_ID
---------- -------------------- --------------------------------------- -------------------- -----------
1 140387465432808 insert into t1(id,name) values(1,'t1'); 1318491 31473
used time: 0.401(ms). Execute id is 1862504.
SQL> sp_close_session(140387465432808);
used time: 1.544(ms). Execute id is 1862505.
当我们对某张表执行DDL操作时(比如修改某张表的表结构),若当前表上有排他锁(未提交的DML事务),此时数据库会根据锁的等待时间抛出锁超时的异常。
DM数据库的DDL锁超时时间是由参数DDL_WAIT_TIME指定,默认十秒,可根据实际需要修改。
select * from v$dm_ini t where t.para_name='DDL_WAIT_TIME';
SQL> select * from v$dm_ini t where t.para_name='DDL_WAIT_TIME';
LINEID PARA_NAME PARA_VALUE MIN_VALUE MAX_VALUE DEFAULT_VALUE MPP_CHK SESS_VALUE FILE_VALUE DESCRIPTION PARA_TYPE
---------- ------------- ---------- --------- --------- ------------- ------- ---------- ---------- ---------------------------------------- ---------
1 DDL_WAIT_TIME 10 0 604800 10 N 10 10 Maximum waiting time in seconds for DDLs SESSION
used time: 13.837(ms). Execute id is 1862506.
insert into t1(id,name) values(2,'t1');
alter table t1 add column info1 varchar(50);
LINEID ID WAIT_FOR_ID WAIT_TIME THRD_ID
---------- -------------------- -------------------- ----------- -----------
used time: 0.545(ms). Execute id is 1862511.
SQL> alter table t1 add column info1 varchar(50);
alter table t1 add column info1 varchar(50);