使用PLSQL演示TM锁互斥现象(二)

2014-11-24 15:32:54 · 作者: · 浏览: 1
:= '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