TM表锁各种mode的实验及2
TM 表锁,发生在insert,update,delete以及select for update操作时,目的是保证操作能够正常进行,并且阻止其它人对表执行DDL操作。 TM锁几种模式的互斥关系图: 在巡检期间,检查如果发现有相关的session_wait锁,可按以下步骤查找相应的锁 1. 使用V$LOCK找
TM 表锁,发生在insert,update,delete以及select for update操作时,目的是保证操作能够正常进行,并且阻止其它人对表执行DDL操作。
TM锁几种模式的互斥关系图:
在巡检期间,检查如果发现有相关的session_wait锁,可按以下步骤查找相应的锁
1. 使用V$LOCK找出session持有的锁。
2. 使用V$SESSION找出持有锁或等待锁的session执行的sql语句。
3. 使用V$SESSION_WAIT找出什么原因导致session持有锁堵塞。
4. 使用V$SESSION获取关于持有锁的程序和用户的更多信息。
V$LOCK中的常用列
SID:表示持有锁的会话信息。
TYPE:表示锁的类型。值包括TM和TX等。
LMODE:表示会话等待的锁模式的信息。用数字0-6表示,和表1相对应。
REQUEST:表示session请求的锁模式的信息。
ID1,ID2:表示锁的对象标识。
例如:首先查出当前TM','TX等待事件的等待会话
BYS@ bys3>select a.sid,a.kaddr,a.addr,a.type,a.id1,a.id2,a.lmode,a.request,a.block from v$lock a where a.type in('TM','TX') order by 1,2;
SID KADDR ADDR TY ID1 ID2 LMODE REQUEST BLOCK
---------- -------- -------- -- ---------- ---------- ---------- ---------- ----------
1 B693D590 B693D560 TM 22326 0 0 3 0
44 B693D590 B693D560 TM 22326 0 5 0
BYS@ bys3>select sql_id from v$session where sid=1; 通过上一步会话SID,查出1号会话当前在等待的语句
SQL_ID
-------------
01mv5v746cfbq
BYS@ bys3>select * from v$sqltext where sql_id='01mv5v746cfbq'; --通过上一步查出SQL_SID,查出SQL_TEXT
ADDRESS HASH_VALUE SQL_ID COMMAND_TYPE PIECE SQL_TEXT
-------- ---------- ------------- ------------ ---------- ------------------------------
25DDD5FC 3362142582 01mv5v746cfbq 6 0
update test set status=8899
用一条语句来查询是:select a.*,b.sid,b.username from v$sqltext a,v$session b,v$lock c where a.sql_id=b.sql_id and b.sid=c.sid and c.type in('TM','TX');
详见:v$session/v$process视图涉及的相关会话信息的查询
BYS@ bys001>select distinct sid from v$mystat;
SID
----------
19
BYS@ bys001>select * from test;
no rows selected
BYS@ bys001>insert into test values(1);
1 row created.
BYS@ bys001>commit;
Commit complete.
BYS@ bys001>select * from test;
A
----------
1
BYS@ bys001>select sid,type,id1,id2,lmode,request,block from v$lock where type in('TM','TX') order by 1,2;
no rows selected
TM锁1号锁实验:
create table order_info(customerid number);
CREATE OR REPLACE PROCEDURE kzcz214001 (cust_id in NUMBER)
AS
BEGIN
insert into order_info values(cust_id);
commit;
END;
/
col owner for a10
col name for a10
col type for a10
select SESSION_ID sid,OWNER,NAME,Type,MODE_HELD held,MODE_REQUESTED request from dba_ddl_locks WHERE NAME='KZCZ214001';
这一句查询dba_ddl_locks表,如果手工建库,dba_ddl_locks表可能不存在,需要SYS用户运行脚本去创建:?/rdbms/admin/catblock.sql
exec kzcz214001(1);
BYS@ bys3>select SESSION_ID sid,OWNER,NAME,Type,MODE_HELD held,MODE_REQUESTED request from dba_ddl_locks WHERE NAME='KZCZ214001';
SID OWNER NAME TYPE HELD REQUEST
---------- ---------- ---------- ---------- --------- ---------
1 BYS KZCZ214001 Table/Proc Null None
edure/Type
BYS@ bys3>select status from dba_objects where object_name='KZCZ214001';
STATUS
-------
VALID
BYS@ bys3>alter table order_info add(name varchar2(10));
Table altered.
BYS@ bys3>select status from dba_objects where object_name='KZCZ214001';
STATUS
-------
INVALID
索引失效后,1号锁还能查到。。。
BYS@ bys3>select SESSION_ID sid,OWNER,NAME,Type,MODE_HELD held,MODE_REQUESTED request from dba_ddl_locks WHERE NAME='KZCZ214001';
SID OWNER NAME TYPE HELD REQUEST
---------- ---------- ---------- ---------- --------- ---------
1 BYS KZCZ214001 Table/Proc Null None
edure/Type
等级共享锁 2 row share----rs
产生2号TM锁方法1:--手动锁定
把在19会话将test表设置为等级共享锁模式
BYS@ bys001>lock table test in row share mode;Table(s) Locked.
可以查询到是在test表加了个模式2的锁
BYS@ bys001>select sid,type,id1,id2,lmode,request,block from v$lock where type in('TM','TX') order by 1,2;
SID TY ID1 ID2 LMODE REQUEST BLOCK
---------- -- ---------- ---------- ---------- ---------- ----------
19 TM 77389 0 2 0 0
BYS@ bys001>select object_name from dba_objects where object_id=77389;
OBJECT_NAME
-------------------------------
TEST
在另一个会话147上做DML操作:
BYS@ bys001>select distinct sid from v$mystat;
SID
----------
147
BYS@ bys001>insert into test values(2);
1 row created.
BYS@ bys001>delete from test where a=1;
1 row deleted.
BYS@ bys001>select * from test;
A
----------
2
BYS@ bys001>update test set a=22 where a=2;
1 row updated.
BYS@ bys001>select * from test;
A
----------
22
在会话19上查询:
BYS@ bys001>select sid,type,id1,id2,lmode,request,block from v$lock where type in('TM','TX') order by 1,2;
SID TY ID1 ID2 LMODE REQUEST BLOCK
---------- -- ---------- ---------- ---------- ---------- ----------
19 TM 77389 0 2 0 0
147 TM 77389 0 3 0 0
147 TX 196621 28393 6 0 0
如果使用DML语句,会报错:ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired
产生2号TM锁方法2:--大表在线建索引
在会话1:--在大表上在线创建索引,要用ONLINE,不用ONLINE不会有2号锁。
BYS@ bys3>create index idx_test1 on test1(id) online;
Index created.
会话2:--有4号锁和2号锁
BYS@ bys3>select * from v$lock where sid=1;
ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK
-------- -------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
2AD66694 2AD666C0 1 AE 100 0 4 0 2154 0
2AD6697C 2AD669A8 1 DL 22325 0 3 0 4 0
2AD66AF0 2AD66B1C 1 OD 22325 0 4 0 4 0
2AD66C64 2AD66C90 1 DL 22325 0 3 0 4 0
B6A0DB98 B6A0DBC8 1 TM 22325 0 2 0 4 0
B6A0DB98 B6A0DBC8 1 TM 22354 0 4 0 4 0
2926D618 2926D690 1 TS 4 16777362 6 0 2 0
28471AE4 28471B24 1 TX 327696 2557 6 0
BYS@ bys3>col object_name for a20
BYS@ bys3>select a.sid,a.type,a.lmode,a.request,b.object_name from v$lock a,dba_objects b where a.id1=b.object_id and sid=1;
SID TY LMODE REQUEST OBJECT_NAME
---------- -- ---------- ---------- --------------------
1 TM 2 0 TEST1
1 TM 4 0 SYS_JOURNAL_22360
1 AE 4 0 ORA$BASE
1 OD 4 0 TEST1
1 DL 3 0 TEST1
1 DL 3 0 TEST1
################################################################################
等级排他锁 row exclusive table lock---RX 3
BYS@ bys001>select distinct sid from v$mystat;SID
----------
19
BYS@ bys001>lock table test in row exclusive mode;
Table(s) Locked.
BYS@ bys001>select sid,type,id1,id2,lmode,request,block from v$lock where type in('TM','TX') order by 1,2;
SID TY ID1 ID2 LMODE REQUEST BLOCK
---------- -- ---------- ---------- ---------- ---------- ----------
19 TM 77389 0 3 0 0
3级锁是一个灵活性比较大的锁,insert delete update,for update 都可以产生一个3级锁,也允许其他事务来修改锁定的表
BYS@ bys001>select * from test;
A
----------
22
BYS@ bys001>update test set a=99 where a=22;
1 row updated.
BYS@ bys001>select * from test;
A
----------
99
BYS@ bys001>select distinct sid from v$mystat;
SID
----------
147
BYS@ bys001>insert into test values(55);
1 row created.
BYS@ bys001>select * from test;
A
----------
22
55
BYS@ bys001>select sid,type,id1,id2,lmode,request,block from v$lock where type in('TM','TX') order by 1,2;
SID TY ID1 ID2 LMODE REQUEST BLOCK
---------- -- ---------- ---------- ---------- ---------- ----------
19 TM 77389 0 3 0 0
19 TX 655390 28214 6 0 0
147 TM 77389 0 3 0 0
147 TX 589824 28423 6 0 0
block列全部是0,没有阻塞。此时,如执行DDL语句,报错:ORA-00054:resource busy and acquire with NOWAIT specified or timeout expired
小结:行级排他锁,通常已经有事务在修改行或者select…for update 修改结果集。允许其他事务对锁定的表进行select insert update delete 或 lock table 同时锁定一张表。
#####################################################################################
共享锁 share table lock 4
BYS@ bys001>select distinct sid from v$mystat;SID
----------
19
BYS@ bys001>select * from test;
A
----------
99
55
BYS@ bys001>lock table test in row share mode;
Table(s) Locked.
BYS@ bys001>select sid,type,id1,id2,lmode,request,block from v$lock where type in('TM','TX') order by 1,2;
SID TY ID1 ID2 LMODE REQUEST BLOCK
---------- -- ---------- ---------- ---------- ---------- ----------
19 TM 77389 0 3 0 0
19 TX 655390 28214 6 0 0
模式标识:4
4级锁禁止其他会话对锁定的表进行DML操作但可以select查询,还允许多个事物一起持有
在会话147上进行删除操作,
BYS@ bys001>select distinct sid from v$mystat;
SID
----------
147
BYS@ bys001>DELETE TEST ;
BYS@ bys001>select sid,type,id1,id2,lmode,request,block from v$lock where type in('TM','TX') order by 1,2;
SID TY ID1 ID2 LMODE REQUEST BLOCK
---------- -- ---------- ---------- ---------- ---------- ----------
19 TM 77389 0 3 0 0
19 TX 655390 28214 6 0 1
147 TM 77389 0 3 0 0
147 TX 655390 28214 0 6 0
BYS@ bys001>lock table test in share mode;
Table(s) Locked.
BYS@ bys001>select sid,type,id1,id2,lmode,request,block from v$lock where type in('TM','TX') order by 1,2;
SID TY ID1 ID2 LMODE REQUEST BLOCK
---------- -- ---------- ---------- ---------- ---------- ----------
19 TM 77389 0 4 0 0
BYS@ bys001>select sid,type,id1,id2,lmode,request,block from v$lock where type in('TM','TX') order by 1,2;
SID TY ID1 ID2 LMODE REQUEST BLOCK
---------- -- ---------- ---------- ---------- ---------- ----------
19 TM 77389 0 4 0 1
147 TM 77389 0 0 3 0
共享锁,其它事务可以查询锁定的表但不能修改,只允许当前事务修改,但可以多个事务持有它。
另一个产生4号锁的,见: --2号锁在线建索引实验。
##########################################################TM锁5号锁实验:
BYS@ bys001>lock table test in share row exclusive mode;
Table(s) Locked.BYS@ bys001>select sid,type,id1,id2,lmode,request,block from v$lock where type in('TM','TX') order by 1,2;
SID TY ID1 ID2 LMODE REQUEST BLOCK
---------- -- ---------- ---------- ---------- ---------- ----------
19 TM 77389 0 5 0 0
BYS@ bys001>select * from test;
no rows selected
BYS@ bys001>select sid,type,id1,id2,lmode,request,block from v$lock where type in('TM','TX') order by 1,2;
SID TY ID1 ID2 LMODE REQUEST BLOCK
---------- -- ---------- ---------- ---------- ---------- ----------
19 TM 77389 0 5 0 0
BYS@ bys001>insert into test values(88);
1 row created.
BYS@ bys001>select sid,type,id1,id2,lmode,request,block from v$lock where type in('TM','TX') order by 1,2;
SID TY ID1 ID2 LMODE REQUEST BLOCK
---------- -- ---------- ---------- ---------- ---------- ----------
19 TM 77389 0 5 0 0
19 TX 524320 28676 6 0 0
在147会话执行DML操作会hang住
BYS@ bys001>insert into test values(88);
此时查询
BYS@ bys001>select sid,type,id1,id2,lmode,request,block from v$lock where type in('TM','TX') order by 1,2;
SID TY ID1 ID2 LMODE REQUEST BLOCK
---------- -- ---------- ---------- ---------- ---------- ----------
19 TM 77389 0 5 0 1
19 TX 524320 28676 6 0 0
147 TM 77389 0 0 3 0
小结:共享行级排他锁,同一时间只允许一个事务持有和修改锁定的表,其他事务可以查询但不能修改。
5号锁--在存储过程运行中会出现:A B两个会话同时执行同一个存储过程时
session B exec p
#############################################
TM锁6号锁实验:
BYS@ bys001>lock table test in exclusive mode;
Table(s) Locked.BYS@ bys001>select sid,type,id1,id2,lmode,request,block from v$lock where type in('TM','TX') order by 1,2;
SID TY ID1 ID2 LMODE REQUEST BLOCK
---------- -- ---------- ---------- ---------- ---------- ----------
19 TM 77389 0 6 0 0
在会话147进行hang住
BYS@ bys001>lock table test in row share mode; ---在此HANG住
BYS@ bys001>select sid,type,id1,id2,lmode,request,block from v$lock where type in('TM','TX') order by 1,2;
SID TY ID1 ID2 LMODE REQUEST BLOCK
---------- -- ---------- ---------- ---------- ---------- ----------
19 TM 77389 0 6 0 1
147 TM 77389 0 0 2 0

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

上周,马斯克举办了 Neuralink 的 Show & Tell 演示活动,向世人展示了脑机接口的最新进展。会上,马斯克表示,从原型到生产非常困难,面临诸多挑战。Neuralink 一直在努力启动人体试验,并且已向 FDA 提交了开始人体试验所需的所有文件。马斯克估计,第一个 Neuralink 设备可能会在 5-6 个月内进入人脑。会上马斯克强调, Neuralink 尊重动物受试者,并且脑机接口设备植入动物体内之前已经进行了广泛的基准测试。两只猴子 Pager 和

insertignore、insert和replace的区别指令已存在不存在举例insert报错插入insertintonames(name,age)values(“小明”,23);insertignore忽略插入insertignoreintonames(name,age)values(“小明”,24);replace替换插入replaceintonames(name,age)values(“小明”,25);表要求:有PrimaryKey,或者unique索引结果:表id都会自增测试代码创建表

使用java的StringBuilder.insert()函数在指定位置插入字符串StringBuilder是Java中用于处理可变字符串的类,它提供了多种方法来操作字符串,其中insert()函数是用于在指定位置插入字符串的常用方法之一。在本文中,我们将介绍如何使用insert()函数来实现在指定位置插入字符串的功能,并给出相应的代码示例。insert()

标题:Oracle中表被锁的原因及解决方法在Oracle数据库中,表被锁是数据库操作中常见的问题之一。表锁定可能会导致数据库性能下降和应用程序无法正常运行。本文将介绍Oracle中表被锁的原因,并提供解决此问题的具体代码示例。原因表被锁的原因通常包括以下几点:事务未提交:当一个事务正在对表进行操作时,其他事务也希望对同一表进行修改操作,就会导致表被锁定。并发

在当今的Web开发时代,有效且高效的表管理变得非常重要,特别是在处理数据量大的Web应用程序时。从表中动态添加、编辑和删除行的能力可以显着增强用户体验并使应用程序更具交互性。实现这一目标的一种有效方法是利用jQuery的强大功能。jQuery提供了许多功能来帮助开发人员执行操作。表格行表格行是相互关联的数据的集合,由HTML中的元素表示。它用于将表格中的单元格(由元素表示)分组在一起。每个元素用于定义表中的一行,对于多属性表,通常包含一个或多个元素。语法$(selector).append(co

如何在MySQL中使用表锁和行锁进行并发控制?在数据库中,经常会遇到多个用户同时对同一数据进行操作的情况,这时就需要通过并发控制来保证数据的一致性。MySQL提供了表锁和行锁两种机制来实现并发控制。本文将重点介绍如何在MySQL中使用表锁和行锁进行并发控制,并给出相应的代码示例。表锁表锁是MySQL中最基本的锁机制,它是对整张表进行加锁。当一个用户对表进行更

insert语句的基本语法“INSERT INTO 表名 (列 1, 列 2, 列 3, ...),VALUES (值 1, 值 2, 值 3, ...);”,“表名”是要插入数据的表的名称,“列 1”、“列 2”、“列 3”等是表中要插入数据的列的名称,“值 1”、“值 2”、“值 3”等是要插入的数据值。

Java中使用StringBuilder类的insert()方法将字符串插入到指定位置在Java中,如果需要对已有的字符串进行插入操作,可以使用StringBuilder类的insert()方法。StringBuilder是可变的字符序列,它提供了一系列的方法来对字符串进行修改和操作。使用insert()方法,可以在指定位置将字符串插入到原有的字符串中,从而
