PLSQL代码如下:

create or replace package pkg_show_tm is-- Author  : DEX-- Created : 1/24/2013 8:29:26 PM-- Purpose : 演示TM锁的兼容性-- 需要事先定义表名,任意表即可-- Action  : Session 1  : exec pkg_show_tm.blocker ;--           Sesssion 2 : set serveroutput on ;            --                        exec pkg_show_tm.waiter ;tb_name varchar2(20) := 't' ;-- Public type declarationsprocedure blocker ;procedure waiter ;end ;
/create or replace package body pkg_show_tm isType rec is record(lockst   varchar2(2000),lockmode varchar2(20));Type t is table of rec;g_statement t;/*进程间通信,发送msg*/procedure send(msg varchar2) isstats integer;begindbms_pipe.pack_message(item => msg);stats := dbms_pipe.send_message(msg);if stats != 0 thenraise_application_error(-20999, msg || ' error in blocker ');end if;end;/*进程间通信,接收msg*/procedure recive(msg varchar2) isstats integer;beginstats := dbms_pipe.receive_message(msg);if stats != 0 thenraise_application_error(-20999, msg || ' error in waiter ');end if;end;/*输出:Space     RS        RX        S         SRX       X         *************************************************************/procedure output_title isbegindbms_output.put(rpad('Space', 10, ' '));dbms_output.put(rpad('RS', 10, ' '));dbms_output.put(rpad('RX', 10, ' '));dbms_output.put(rpad('S', 10, ' '));dbms_output.put(rpad('SRX', 10, ' '));dbms_output.put_line(rpad('X', 10, ' '));dbms_output.put_line(rpad('*', 60, '*'));end;/*session 1 = blocker 循环执行加锁操作 阻塞session 2*/procedure blocker isbeginfor i in 1 .. g_statement.last loopexecute immediate g_statement(i).lockst;send(g_statement(i).lockmode);                  --发送消息recive(g_statement(i).lockmode || 's');         --等待接收消息,以判断是否可以继续执行下一个加锁操作commit;end loop;end;/*session 2 = waiter 循环执行加锁操作,以判断与session 1 是否互斥*/procedure waiter isbeginoutput_title;/* output :Space     RS        RX        S         SRX       X         *************************************************************/for i in 1 .. g_statement.last looprecive(g_statement(i).lockmode);                --等待session 1 发送的消息,以判断session 1 是否已经成功加锁dbms_output.put(rpad(g_statement(i).lockmode, 10, ' '));/* output :Space     RS        RX        S         SRX       X         ************************************************************RS*/for j in 1 .. g_statement.last loop/*这里如果session 2 中的加锁操作与session 1 如果互斥,则会爆出ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired为了省事,直接加others捕获*/beginexecute immediate g_statement(j).lockst;dbms_output.put(rpad('Yes', 10, ' '));commit;exceptionwhen others thendbms_output.put(rpad('No', 10, ' '));commit;end;end loop;dbms_output.put_line(' ');/* output :Space     RS        RX        S         SRX       X         ************************************************************RS        Yes       Yes       Yes       Yes       No*/send(g_statement(i).lockmode || 's');     --发送消息给session 1end loop;end;
/*
操作说明:
lock table tun2_tab in ROW SHARE mode ;           lmode=2
lock table tun2_tab in ROW EXCLUSIVE mode ;       lmode=3
lock table tun2_tab in SHARE MODE ;               lmode=4
lock table tun2_tab in SHARE ROW EXCLUSIVE MODE ; lmode=5
lock table tun2_tab in EXCLUSIVE MODE ;           lmode=6
*/
beging_statement := t();g_statement.extend(5);g_statement(1).lockst := 'lock table ' || pkg_show_tm.tb_name ||' in ROW SHARE mode nowait ';g_statement(1).lockmode := 'RS';g_statement(2).lockst := '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        NoPL/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

使用PLSQL演示TM锁互斥现象相关推荐

  1. 发生TM锁争用的情况

    Row Lock(TX)保护特定行: Table Lock(TM)保护整个表 一般发生TM锁争用的情况如下: 1)修改无索引外键(foreign key)的父键时:在子表的外键没有索引的状态下,若父表 ...

  2. oracle锁mode,【案例】Oracle dml操作产生TM锁 lmode=6 分析原因和解决办法

    [案例]Oracle dml操作产生TM锁 lmode=6 分析原因和解决办法 时间:2016-12-04 20:22   来源:Oracle研究中心   作者:网络   点击: 次 天萃荷净 Ora ...

  3. Java简单演示悲观锁

    每博一文案 看过这样一句话,时间在不断的筛选你身边的人和事.当你什么都不在乎的时候,你的人生才刚刚开始. 当我们什么都不在乎时,会发现什么都可能会进行经历,但什么都一定会过去,起始都会离开的或早或晚吧 ...

  4. oracle 闩情况,理解oracle锁和oracle闩(3)TX锁和TM锁

    oracle没有锁管理器和锁列表,这样可以避免行级锁维护的开销和行级锁数量不足导致的争用问题.在Oracle的每行数据上,都有一个标志位来表示该行数据是否被锁定,要查看某一行是否被锁定,必须直接找到这 ...

  5. ORACLE的TX锁和TM锁及解锁

    数据库是一个并发访问的系统,所以说对一个数据库来说最大的问题就是并发控制的问题,这个并发控制所表现的不是在并发读上面,而是在并发写上面.对应并发写,就需要保证数据的一致性!那么什么是是数据一致性呢? ...

  6. oracle 频繁 tm tx,oracle频繁出现TX/TM锁问题

    数据库频繁出现TX和TM类型的锁,通过脚本查看,所有外键均已创建索引,但还是出现锁表的情况,有没有大神能给个思路啊? 被锁的两张表关系 SUBSYS这个表是父表 RESULTHANDLE这个是子表 执 ...

  7. oracle中的tx锁影响查询吗,如何找到TM锁对应的TX锁?

    我昨天也这样试过,但出来的结果和预料相差很远. wyq@ORCL>update emp set ename = ename; 12 rows updated. wyq@ORCL>get l ...

  8. 【高并发】怎么演示公平锁和非公平锁?

    1.概述 转:添加链接描述 本文主要用juc中的ReentrantLock来说一下公平锁和非公平锁的东西. 2. 先理解一下什么是公平锁.非公平锁? 公平锁和非公平锁体现在别人释放锁的一瞬间,如果前面 ...

  9. plsql查询是否锁表Oracle

    1.登录系统,建用使用system登录,不然需要赋权给相应的用户 赋权(sys登录状态)rant connect,resource,dba to TSAMS(用户名): 2.锁表涉及的表及视图 --当 ...

  10. Oracle之 PLSQL语言

    视频课:https://edu.csdn.net/course/play/7940 4.1 PL/SQL简介 4.1.1 PL/SQL概述 PL/SQL是Oracle在标准SQL语言上的过程性扩展,它 ...

最新文章

  1. 疯狂ios讲义疯狂连载之日期选择器(UIDatePicker)
  2. Python collection模块
  3. fork join框架使用_Java:使用Fork / Join框架的Mergesort
  4. 【转】tftp命令详解
  5. linux有读EC RAM的工具吗,Step to UEFI (179)Shell下 EC Ram 读取工具
  6. 算法高级(18)-Redis Cluster选举机制
  7. PythonBasics 中文系列教程 · 翻译完成
  8. 友好的免抠图片素材| PNG设计元素集海量来袭
  9. 如何正确使用 Flink Connector?
  10. win7域用户生成临时文件夹
  11. PMP考试教材是什么?有几本?
  12. 银行笔试题 java笔试题
  13. 阿里云 短信 sdk 导致strtotime时间戳转换错误 相差8小时
  14. centos下安装CH341驱动
  15. vscode如何配置java环境_VSCode 配置Java环境
  16. bzoj2286【SDOI2011】消耗战
  17. android WebView加载网页视频
  18. 提高网站关键词排名优化技巧!
  19. 两天赚 2 千,用 Python 接私活,真香!
  20. 献给小白的笔记day6

热门文章

  1. 成功解决ERROR: Command errored out with exit status 1:    command: 'f:\program files\python\python36\pyt
  2. php验证电子邮箱格式正确,php判断电子邮件是否正确方法
  3. latex IEEEtran bib参考文献title双引号
  4. C/C++音乐播放(亲测有效)
  5. 浅析数据中心存储发展趋势
  6. oracle监听时区,对Oracle中时区及时间的认识
  7. http响应报文,如果响应的内容比较大,客户端怎么样判断接收完了呢?
  8. 淘宝搜索上传图片获得上传sid
  9. C#实现远程关机与远程开机(唤醒)
  10. c语言算个人所得税的源代码,C语言编写一个计算个人所得税的程序,要求输入收入金额,能够输...