:= 'lock table ' || pkg_show_tm.tb_name ||
' in ROW EXCLUSIVE mode nowait ';
g_statement(2).lockmode := 'RX';
g_statement(3).lockst := 'lock table ' || pkg_show_tm.tb_name ||
' in SHARE MODE nowait ';
g_statement(3).lockmode := 'S';
g_statement(4).lockst := 'lock table ' || pkg_show_tm.tb_name ||
' in SHARE ROW EXCLUSIVE MODE nowait ';
g_statement(4).lockmode := 'SRX';
g_statement(5).lockst := 'lock table ' || pkg_show_tm.tb_name ||
' in EXCLUSIVE MODE nowait ';
g_statement(5).lockmode := 'X';
end;
/
最好用sys执行,不然需要额外授权grant execute on dbms_pipe to &user ;
_sys@FAKE10> create table t (x int) tablespace users ;
Table created.
Session 1 :
_sys@FAKE10> exec pkg_show_tm.blocker ;
PL/SQL procedure successfully completed.
Session 2 :
_sys@FAKE10>
set serveroutput on
_sys@FAKE10> exec pkg_show_tm.waiter ;
Space RS RX S SRX X
************************************************************
RS Yes Yes Yes Yes No
RX Yes Yes No No No
S Yes No Yes No No
SRX Yes No No No No
X No No No No No
PL/SQL procedure successfully completed.
思路其实很简单,要演示TM锁互斥的时候。需要开启2个session。例如:
session 1 执行
lock table tun2_tab in ROW SHARE mode ;
session 2 依次执行
lock table tun2_tab in (ROW SHARE|ROW EXCLUSIVE|...) mode ;
查看session 2 是否发生了等待 。
这里
session 1 = pkg_show_tm .blocker
session 2 = pkg_show_tm.waiter