使用PLSQL演示TM锁互斥现象
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锁互斥现象相关推荐
- 发生TM锁争用的情况
Row Lock(TX)保护特定行: Table Lock(TM)保护整个表 一般发生TM锁争用的情况如下: 1)修改无索引外键(foreign key)的父键时:在子表的外键没有索引的状态下,若父表 ...
- oracle锁mode,【案例】Oracle dml操作产生TM锁 lmode=6 分析原因和解决办法
[案例]Oracle dml操作产生TM锁 lmode=6 分析原因和解决办法 时间:2016-12-04 20:22 来源:Oracle研究中心 作者:网络 点击: 次 天萃荷净 Ora ...
- Java简单演示悲观锁
每博一文案 看过这样一句话,时间在不断的筛选你身边的人和事.当你什么都不在乎的时候,你的人生才刚刚开始. 当我们什么都不在乎时,会发现什么都可能会进行经历,但什么都一定会过去,起始都会离开的或早或晚吧 ...
- oracle 闩情况,理解oracle锁和oracle闩(3)TX锁和TM锁
oracle没有锁管理器和锁列表,这样可以避免行级锁维护的开销和行级锁数量不足导致的争用问题.在Oracle的每行数据上,都有一个标志位来表示该行数据是否被锁定,要查看某一行是否被锁定,必须直接找到这 ...
- ORACLE的TX锁和TM锁及解锁
数据库是一个并发访问的系统,所以说对一个数据库来说最大的问题就是并发控制的问题,这个并发控制所表现的不是在并发读上面,而是在并发写上面.对应并发写,就需要保证数据的一致性!那么什么是是数据一致性呢? ...
- oracle 频繁 tm tx,oracle频繁出现TX/TM锁问题
数据库频繁出现TX和TM类型的锁,通过脚本查看,所有外键均已创建索引,但还是出现锁表的情况,有没有大神能给个思路啊? 被锁的两张表关系 SUBSYS这个表是父表 RESULTHANDLE这个是子表 执 ...
- oracle中的tx锁影响查询吗,如何找到TM锁对应的TX锁?
我昨天也这样试过,但出来的结果和预料相差很远. wyq@ORCL>update emp set ename = ename; 12 rows updated. wyq@ORCL>get l ...
- 【高并发】怎么演示公平锁和非公平锁?
1.概述 转:添加链接描述 本文主要用juc中的ReentrantLock来说一下公平锁和非公平锁的东西. 2. 先理解一下什么是公平锁.非公平锁? 公平锁和非公平锁体现在别人释放锁的一瞬间,如果前面 ...
- plsql查询是否锁表Oracle
1.登录系统,建用使用system登录,不然需要赋权给相应的用户 赋权(sys登录状态)rant connect,resource,dba to TSAMS(用户名): 2.锁表涉及的表及视图 --当 ...
- Oracle之 PLSQL语言
视频课:https://edu.csdn.net/course/play/7940 4.1 PL/SQL简介 4.1.1 PL/SQL概述 PL/SQL是Oracle在标准SQL语言上的过程性扩展,它 ...
最新文章
- 疯狂ios讲义疯狂连载之日期选择器(UIDatePicker)
- Python collection模块
- fork join框架使用_Java:使用Fork / Join框架的Mergesort
- 【转】tftp命令详解
- linux有读EC RAM的工具吗,Step to UEFI (179)Shell下 EC Ram 读取工具
- 算法高级(18)-Redis Cluster选举机制
- PythonBasics 中文系列教程 · 翻译完成
- 友好的免抠图片素材| PNG设计元素集海量来袭
- 如何正确使用 Flink Connector?
- win7域用户生成临时文件夹
- PMP考试教材是什么?有几本?
- 银行笔试题 java笔试题
- 阿里云 短信 sdk 导致strtotime时间戳转换错误 相差8小时
- centos下安装CH341驱动
- vscode如何配置java环境_VSCode 配置Java环境
- bzoj2286【SDOI2011】消耗战
- android WebView加载网页视频
- 提高网站关键词排名优化技巧!
- 两天赚 2 千,用 Python 接私活,真香!
- 献给小白的笔记day6
热门文章
- 成功解决ERROR: Command errored out with exit status 1: command: 'f:\program files\python\python36\pyt
- php验证电子邮箱格式正确,php判断电子邮件是否正确方法
- latex IEEEtran bib参考文献title双引号
- C/C++音乐播放(亲测有效)
- 浅析数据中心存储发展趋势
- oracle监听时区,对Oracle中时区及时间的认识
- http响应报文,如果响应的内容比较大,客户端怎么样判断接收完了呢?
- 淘宝搜索上传图片获得上传sid
- C#实现远程关机与远程开机(唤醒)
- c语言算个人所得税的源代码,C语言编写一个计算个人所得税的程序,要求输入收入金额,能够输...