Table des matières
TM锁6号锁实验:
等级共享锁 2 row share----rs
产生2号TM锁方法1:--手动锁定
产生2号TM锁方法2:--大表在线建索引
等级排他锁 row exclusive table lock---RX 3
共享锁 share table lock 4
另一个产生4号锁的,见:  --2号锁在线建索引实验。
Maison base de données tutoriel 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

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Les essais sur l'homme seront-ils abandonnés ? Neuralink de Musk fait l'objet d'une enquête fédérale, les animaux expérimentaux meurent fréquemment Les essais sur l'homme seront-ils abandonnés ? Neuralink de Musk fait l'objet d'une enquête fédérale, les animaux expérimentaux meurent fréquemment Apr 12, 2023 pm 05:37 PM

La semaine dernière, Musk a organisé l’événement de démonstration Show & Tell de Neuralink pour montrer au monde les derniers progrès dans les interfaces cerveau-ordinateur. Lors de la réunion, Musk a déclaré qu'il était très difficile de passer du prototype à la production et qu'il était confronté à de nombreux défis. Neuralink a travaillé dur pour lancer des essais sur l'homme et a soumis toute la documentation nécessaire à la FDA pour commencer les essais sur l'homme. Musk estime que le premier appareil Neuralink pourrait être installé dans le cerveau humain d’ici 5 à 6 mois. Lors de la réunion, Musk a souligné que Neuralink respecte les sujets animaux et que les dispositifs d'interface cerveau-ordinateur ont subi des tests de référence approfondis avant d'être implantés chez des animaux. Deux singes Pager et

Quelle est la différence entre insérer ignorer, insérer et remplacer dans MySQL Quelle est la différence entre insérer ignorer, insérer et remplacer dans MySQL May 29, 2023 pm 04:40 PM

La différence entre les instructions insertignore, insert et replace existe déjà ou non. Exemple d'erreur d'insertion Insertintonames(name,age)values("Xiaoming",23);insertignore ignore insertignoreintonames(name,age)values("Xiaoming",24) ;replace Remplacer et insérer replaceintonames(name,age)values("Xiao Ming", 25); exigences de la table : clé primaire, ou résultat d'index unique : l'identifiant de la table sera automatiquement incrémenté. Le code de test crée la table.

Utilisez la fonction StringBuilder.insert() de Java pour insérer une chaîne à la position spécifiée Utilisez la fonction StringBuilder.insert() de Java pour insérer une chaîne à la position spécifiée Jul 24, 2023 pm 09:37 PM

Utilisez la fonction StringBuilder.insert() de Java pour insérer une chaîne à une position spécifiée. StringBuilder est une classe en Java utilisée pour gérer les chaînes variables. Elle fournit une variété de méthodes pour faire fonctionner les chaînes. méthodes courantes d’insertion positionnelle de chaînes. Dans cet article, nous présenterons comment utiliser la fonction insert() pour insérer une chaîne à une position spécifiée et donnerons des exemples de code correspondants. insérer()

Quelles sont les raisons et les solutions des verrous de table dans Oracle ? Quelles sont les raisons et les solutions des verrous de table dans Oracle ? Mar 10, 2024 pm 10:48 PM

Titre : Raisons et solutions pour les verrous de table dans Oracle Dans la base de données Oracle, les verrous de table sont l'un des problèmes courants dans les opérations de base de données. Les verrous de table peuvent entraîner une dégradation des performances de la base de données et un dysfonctionnement des applications. Cet article présentera les raisons pour lesquelles les tables sont verrouillées dans Oracle et fournira des exemples de code spécifiques pour résoudre ce problème. Raisons Les raisons pour lesquelles une table est verrouillée incluent généralement les points suivants : Transaction non validée : lorsqu'une transaction opère sur la table, d'autres transactions souhaitent également modifier la même table, ce qui entraînera le verrouillage de la table. concurrent

Comment ajouter, modifier et supprimer des lignes de tableau dans jQuery ? Comment ajouter, modifier et supprimer des lignes de tableau dans jQuery ? Sep 05, 2023 pm 09:49 PM

À l'ère actuelle du développement Web, une gestion efficace et efficiente des tables est devenue très importante, en particulier lorsqu'il s'agit d'applications Web gourmandes en données. La possibilité d'ajouter, de modifier et de supprimer dynamiquement des lignes d'un tableau peut améliorer considérablement l'expérience utilisateur et rendre les applications plus interactives. Un moyen efficace d’y parvenir consiste à exploiter la puissance de jQuery. jQuery fournit de nombreuses fonctionnalités pour aider les développeurs à effectuer des opérations. Lignes de tableau Une ligne de tableau est une collection de données interdépendantes, représentées par des éléments en HTML. Il permet de regrouper des cellules (représentées par des éléments) dans un tableau. Chaque élément est utilisé pour définir une ligne dans le tableau, et pour les tableaux multi-attributs, il contient généralement un ou plusieurs éléments. Syntaxe$(sélecteur).append(co

Comment utiliser les verrous de table et de ligne pour le contrôle de concurrence dans MySQL ? Comment utiliser les verrous de table et de ligne pour le contrôle de concurrence dans MySQL ? Jul 29, 2023 pm 08:39 PM

Comment utiliser les verrous de table et de ligne pour le contrôle de concurrence dans MySQL ? Dans les bases de données, nous rencontrons souvent des situations dans lesquelles plusieurs utilisateurs opèrent simultanément sur les mêmes données. Dans ce cas, un contrôle de concurrence est nécessaire pour garantir la cohérence des données. MySQL fournit deux mécanismes : les verrous de table et les verrous de ligne pour obtenir un contrôle de concurrence. Cet article se concentrera sur la façon d'utiliser les verrous de table et de ligne pour le contrôle de concurrence dans MySQL, et donnera des exemples de code correspondants. Verrouillage de table Le verrouillage de table est le mécanisme de verrouillage le plus basique de MySQL. Il verrouille la table entière. Lorsqu'un utilisateur met à jour une table

insérer une instruction insérer une instruction Sep 15, 2023 pm 01:30 PM

La syntaxe de base de l'instruction d'insertion est "INSERT INTO nom de la table (colonne 1, colonne 2, colonne 3, ...), VALUES (valeur 1, valeur 2, valeur 3, ...);", "nom de la table" doit être inséré Le nom du tableau de données. "Colonne 1", "Colonne 2", "Colonne 3", etc. sont les noms des colonnes du tableau dans lesquelles les données doivent être insérées "Valeur 1", ". Valeur 2", "Valeur 3", etc. sont les noms des colonnes à insérer. valeur des données.

Utilisez la méthode insert() de la classe StringBuilder en Java pour insérer une chaîne dans un emplacement spécifié Utilisez la méthode insert() de la classe StringBuilder en Java pour insérer une chaîne dans un emplacement spécifié Jul 25, 2023 pm 05:18 PM

En Java, utilisez la méthode insert() de la classe StringBuilder pour insérer une chaîne dans un emplacement spécifié. En Java, si vous devez insérer une chaîne existante, vous pouvez utiliser la méthode insert() de la classe StringBuilder. StringBuilder est une séquence de caractères variable qui fournit une série de méthodes pour modifier et exploiter des chaînes. En utilisant la méthode insert(), vous pouvez insérer une chaîne dans la chaîne d'origine à une position spécifiée, ainsi

See all articles