목차
TM锁6号锁实验:
等级共享锁 2 row share----rs
产生2号TM锁方法1:--手动锁定
产生2号TM锁方法2:--大表在线建索引
等级排他锁 row exclusive table lock---RX 3
共享锁 share table lock 4
另一个产生4号锁的,见:  --2号锁在线建索引实验。
데이터 베이스 MySQL 튜토리얼 TM表锁各种mode的实验及2

TM表锁各种mode的实验及2

Jun 07, 2016 pm 03:48 PM
insert mode 실험 테이블 잠금

TM 表锁,发生在insert,update,delete以及select for update操作时,目的是保证操作能够正常进行,并且阻止其它人对表执行DDL操作。 TM锁几种模式的互斥关系图: 在巡检期间,检查如果发现有相关的session_wait锁,可按以下步骤查找相应的锁 1. 使用V$LOCK找


TM 表锁,发生在insert,update,delete以及select for update操作时,目的是保证操作能够正常进行,并且阻止其它人对表执行DDL操作。

TM锁几种模式的互斥关系图:

TM表锁各种mode的实验及2

在巡检期间,检查如果发现有相关的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视图涉及的相关会话信息的查询

1.环境准备:--有些实验数据是后来补充的,可能不太一致。
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

小结:行级共享锁,是限制最少的TM锁,可以提供最高程度的并发性。其他会话可以对锁定的表进行任何类型的DML操作,还可以与其他会话锁并存。
################################################################################

等级排他锁 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 A   exec p
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

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

인간의 시련은 폐기될 것인가? Musk의 Neuralink는 연방 조사를 받고 실험 동물은 자주 죽습니다 인간의 시련은 폐기될 것인가? Musk의 Neuralink는 연방 조사를 받고 실험 동물은 자주 죽습니다 Apr 12, 2023 pm 05:37 PM

지난 주 머스크는 뇌-컴퓨터 인터페이스의 최신 발전 상황을 전 세계에 보여주기 위해 Neuralink의 Show & Tell 시연 이벤트를 개최했습니다. 회의에서 머스크는 프로토타입에서 생산까지 진행하는 것이 매우 어렵고 많은 어려움에 직면해 있다고 말했습니다. Neuralink는 인간 실험을 시작하기 위해 열심히 노력해 왔으며 인간 실험을 시작하기 위해 FDA에 필요한 모든 문서를 제출했습니다. 머스크는 최초의 뉴럴링크(Neuralink) 장치가 5~6개월 내에 인간의 뇌에 들어갈 수 있을 것으로 추정하고 있습니다. 회의에서 머스크는 뉴럴링크가 동물 대상을 존중하며 뇌-컴퓨터 인터페이스 장치가 동물에 이식되기 전에 광범위한 벤치마크 테스트를 거쳤다고 강조했습니다. 원숭이 두 마리 호출기와

mysql에서 삽입 무시, 삽입 및 교체의 차이점은 무엇입니까 mysql에서 삽입 무시, 삽입 및 교체의 차이점은 무엇입니까 May 29, 2023 pm 04:40 PM

insertignore, insert 및 replacement 명령어의 차이가 이미 존재하는지 여부 ;replace insertintonames(name,age)values("Xiao Ming", 25); 테이블 요구 사항: PrimaryKey 또는 고유 인덱스 결과: 테이블 ID가 자동으로 증가되어 테이블이 생성됩니다.

Jul 24, 2023 pm 09:37 PM

java의 StringBuilder.insert() 함수를 사용하여 특정 위치에 문자열을 삽입합니다. StringBuilder는 문자열을 조작하는 다양한 방법을 제공하는 Java의 클래스입니다. 문자열을 위치적으로 삽입하는 일반적인 방법. 이번 글에서는 insert() 함수를 사용하여 지정된 위치에 문자열을 삽입하는 방법을 소개하고 해당 코드 예제를 제공합니다. 끼워 넣다()

Oracle에서 테이블 잠금이 발생하는 이유와 해결 방법은 무엇입니까? Oracle에서 테이블 잠금이 발생하는 이유와 해결 방법은 무엇입니까? Mar 10, 2024 pm 10:48 PM

제목: Oracle의 테이블 잠금에 대한 이유와 해결 방법 Oracle 데이터베이스에서 테이블 잠금은 데이터베이스 작업에서 흔히 발생하는 문제 중 하나입니다. 테이블 잠금으로 인해 데이터베이스 성능이 저하되고 애플리케이션이 제대로 작동하지 않을 수 있습니다. 이 문서에서는 Oracle에서 테이블이 잠기는 이유를 소개하고 이 문제를 해결하기 위한 구체적인 코드 예제를 제공합니다. 이유 테이블이 잠기는 이유에는 일반적으로 다음 사항이 포함됩니다. 커밋되지 않은 트랜잭션: 해당 테이블에서 트랜잭션이 작동 중일 때 다른 트랜잭션도 동일한 테이블을 수정하려고 하여 테이블이 잠기게 됩니다. 경쟁 상대

MySQL에서 동시성 제어를 위해 테이블 ​​잠금 및 행 잠금을 사용하는 방법은 무엇입니까? MySQL에서 동시성 제어를 위해 테이블 ​​잠금 및 행 잠금을 사용하는 방법은 무엇입니까? Jul 29, 2023 pm 08:39 PM

MySQL에서 동시성 제어를 위해 테이블 ​​잠금 및 행 잠금을 사용하는 방법은 무엇입니까? 데이터베이스에서는 여러 사용자가 동시에 동일한 데이터를 작업하는 상황이 자주 발생합니다. 이 경우 데이터 일관성을 보장하기 위해 동시성 제어가 필요합니다. MySQL은 동시성 제어를 달성하기 위해 테이블 ​​잠금과 행 잠금이라는 두 가지 메커니즘을 제공합니다. 이 기사에서는 MySQL에서 동시성 제어를 위해 테이블 ​​잠금 및 행 잠금을 사용하는 방법에 중점을 두고 해당 코드 예제를 제공합니다. 테이블 잠금 테이블 잠금은 MySQL의 가장 기본적인 잠금 메커니즘입니다. 전체 테이블을 잠급니다. 사용자가 테이블을 업데이트할 때

jQuery에서 테이블 행을 추가, 편집 및 삭제하는 방법은 무엇입니까? jQuery에서 테이블 행을 추가, 편집 및 삭제하는 방법은 무엇입니까? Sep 05, 2023 pm 09:49 PM

오늘날의 웹 개발 시대에는 특히 데이터가 많은 웹 애플리케이션을 다룰 때 효과적이고 효율적인 테이블 관리가 매우 중요해졌습니다. 테이블에서 행을 동적으로 추가, 편집 및 삭제하는 기능은 사용자 경험을 크게 향상시키고 애플리케이션을 보다 대화형으로 만들 수 있습니다. 이를 달성하는 효과적인 방법은 jQuery의 기능을 활용하는 것입니다. jQuery는 개발자가 작업을 수행하는 데 도움이 되는 많은 기능을 제공합니다. 테이블 행 테이블 행은 HTML의 요소로 표시되는 상호 연관된 데이터의 모음입니다. 테이블의 셀(요소로 표시)을 그룹화하는 데 사용됩니다. 각 요소는 테이블의 행을 정의하는 데 사용되며 다중 속성 테이블의 경우 일반적으로 하나 이상의 요소를 포함합니다. 구문$(선택기).append(co

문 삽입 문 삽입 Sep 15, 2023 pm 01:30 PM

insert 문의 기본 구문은 "INSERT INTO 테이블 이름(열 1, 열 2, 열 3, ...), VALUES(값 1, 값 2, 값 3, ...);", "테이블 이름"입니다. 삽입할 데이터 테이블의 이름입니다. "열 1", "열 2", "열 3" 등은 데이터가 삽입될 테이블의 열 이름입니다. Value 2", "Value 3" 등은 삽입할 컬럼의 이름입니다.

Java에서 StringBuilder 클래스의 insert() 메소드를 사용하여 지정된 위치에 문자열을 삽입합니다. Java에서 StringBuilder 클래스의 insert() 메소드를 사용하여 지정된 위치에 문자열을 삽입합니다. Jul 25, 2023 pm 05:18 PM

Java에서는 StringBuilder 클래스의 insert() 메서드를 사용하여 지정된 위치에 문자열을 삽입할 수 있습니다. Java에서는 기존 문자열을 삽입해야 하는 경우 StringBuilder 클래스의 insert() 메서드를 사용할 수 있습니다. StringBuilder는 문자열을 수정하고 작동하는 일련의 메서드를 제공하는 가변 문자 시퀀스입니다. insert() 메소드를 사용하면 원래 문자열의 지정된 위치에 문자열을 삽입할 수 있습니다.

See all articles