oracle的TM锁T锁知识完全普及
oracle数据库中锁、序列、索引管理

详析Oracle数据库中锁、序列、索引管理一、锁1.1什么是锁数据库是一个多用户使用的共享资源。
当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。
若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。
而锁就是用于控制事务对数据的访问,实现事务的并发控制,保持数据库的一致性。
1.2锁的类型DDL锁:被Oracle自动的发布和释放DML锁:在事务处理的开始时被施加,而且在事务处理完成时被释放(使用Commit 或Rollback时被释放)内部锁:由Oracle自己管理以保护内部数据库结构注:DDL锁由数据库自动管理;DML锁和内部锁可以由用户直接或间接管理。
1.3锁的粒度1)TX锁:行级锁(事务锁),会阻止这行上其它DML操作,直到Commit或Rollback 时被释放,它只有X排他锁2)TM锁:表级锁。
2.1)Row-S 行共享(RS):共享行锁,即可被其他事务查询该行。
2.2)Row-X 行专用(RX):用于行的修改,即禁止其他事务对该行的所有操作。
2.3)Share 共享锁(S):阻止其他DML操作2.4)S/Row-X 共享行专用(SRX):阻止其他事务操作2.5)exclusive 专用(X):独立访问使用3)数据库级锁:锁定数据库为限制模式alter system enable restricted session;以下语句将锁定数据库为只读模式startup mount;alter database open read only;1.4锁的模式和使用1)共享锁(Share Table Lock,S):使用情况:当执行事务时,事务所要操作的表不希望被别的事务更新时可以使用。
即某表被加锁后只能被加锁的事务全权控制,其他事务只能对该表执行查询操作。
加锁语法:Lock Table TableName In Share Mode;使用度:中。
当对表执行大面积更新操作时可使用,反之,则不用。
oracle锁原理

oracle锁原理Oracle数据库系统是当今最为流行和广泛使用的关系型数据库管理系统之一。
在Oracle中,锁是实现并发控制的重要机制之一。
本文将探讨Oracle锁的原理,包括锁的种类、分级和适用场景等。
一、概述在多用户并发访问的数据库环境中,锁的作用是确保数据的完整性和一致性。
Oracle中的锁可以分为共享锁(Shared Lock)和排他锁(Exclusive Lock)两种类型。
1. 共享锁(Shared Lock)共享锁允许多个事务同时读取同一个数据对象,但不允许对该数据对象进行修改。
当一个事务获取了共享锁后,其他事务只能再获取共享锁,而不能获取排他锁。
共享锁之间是兼容的,可以共存。
2. 排他锁(Exclusive Lock)排他锁是最严格的锁类型,它在事务需要修改数据对象时才会被获取。
当一个事务获取了排他锁后,其他事务无法同时获取共享锁或排他锁,保证了数据对象的独占性。
二、锁的级别Oracle中的锁按照锁住范围的不同可以分为表级锁(Table Lock)和行级锁(Row Lock)两种级别。
1. 表级锁(Table Lock)表级锁是对整个表进行加锁,当一个事务对某个表加锁时,其他事务无法修改该表中的任何数据。
表级锁的粒度大,锁的冲突较多,对并发性能有一定的影响,因此在实际应用中尽量避免使用表级锁。
2. 行级锁(Row Lock)行级锁是对表中的每一行进行加锁,当一个事务对某一行加锁时,其他事务可以同时对其他行进行修改。
行级锁的粒度小,锁的粒度细,可以提高并发性能。
Oracle通过使用多版本并发控制(Multi-Version Concurrency Control,MVCC)来实现行级锁。
三、锁的控制策略Oracle通过以下几种控制策略来管理锁:1. 乐观并发控制(Optimistic Concurrency Control,OCC)乐观并发控制假设并发事务之间的冲突较少,因此允许事务在修改数据时不获取锁,而是在提交时检测是否有冲突发生。
oracle的TM锁TX锁知识完全普及

o r a c l e的T M锁T X锁知识完全普及Hessen was revised in January 2021oracle的TM锁、TX锁知识完全普及锁概念基础数据库是一个多用户使用的共享资源。
当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。
若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。
加锁是实现数据库并发控制的一个非常重要的技术。
当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。
加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。
在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。
当数据对象被加上排它锁时,其他的事务不能对它读取和修改。
加了共享锁的数据对象可以被其他事务读取,但不能修改。
数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。
Oracle数据库的锁类型根据保护的对象不同,Oracle数据库锁可以分为以下几大类:DML锁(data locks,数据锁),用于保护数据的完整性;DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;内部锁和闩(internal locks and latches),保护数据库的内部结构。
DML锁的目的在于保证并发情况下的数据完整性,。
在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。
当Oracle 执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。
当TM 锁获得后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位。
这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。
oracle的锁与并发机制

oracle的锁与并发机制锁是并发访问的时候用于保护不共享资源不被同时并发修改的机制。
oracle锁分为DML锁,DDL锁,内部锁和latchDML锁确保一次只能只有一个人修改某一行(TX锁),而且正在处理一个表时别人不能删除(TM锁)。
DDL锁,在DDL操作是系统会自动为对象加上DDL锁,保护这些对象不被其他会话锁修改。
latch是轻量级的串行化设备,用于协调对共享数据结构、对象、文件的多用户访问,一般都是保护共享内存结构使用的锁,在此不做讨论。
一般的锁管理器工作过程:1.找到想要锁定的那一行地址2.在锁管理器排队3.锁定列表4.搜索列表,查看别人是否锁定这一行5.在列表中创建一个新的条目,表明已经锁定这一行6.对列表解锁接下里修改,之后提交修改后,继续过程:7.再次排队8.锁住锁的列表9.在这个列表中锁定,并释放所有的锁10.对列表解锁oracle锁管理方式:找到需要锁定的那行地址到达那一行锁定这一行通常lock有三个组件:Resource Structure(资源)、Lock Structure(锁)和Enqueue(排队机制)Resource和lock是数据结构,而Enqueue是算法。
Resource Structure每一个需要并发控制的资源都有用这个数据结构来描述,先关的成员为:owner、waiter和converter,这是三个指针,分别指向3个由Lock Structure组成的链表。
Lock Structure每当进程需要访问共享资源时,必须先“锁定”该资源,这个动作实际上是从内存中申请一个Lock Structure,,在其中记录“锁模式、进程ID”等重要信息。
然后看是否立即能够获得资源的访问权,如果不能的话将这个Lock structure挂到Resource Structure的Waiter链表中,如果能够获得,则把Lock Structure的owner链表中。
最常用的锁模式Share 拥有这对资源进行只读访问,允许其他用户并发只读访问Exclusive 拥有者对资源进行修改访问,不允许其他用户并发访问Enqueue 算法Lock使用的是Enqueue算法,可以理解为“先入先出队列”,如果进程的锁定请求不能满足,该进程的Lock Structure就被加到Waiter链表的末端。
Oracle中锁的产生和解锁

Oracle中锁的产品和解锁文档修改记录1Oracle锁的介绍在多进程或者多线程业务系统中,多个Oracle用户可以同时登录到一个Oracle数据库,对数据库中的数据进行操作难免会出现同时访问同一数据(表或者表中某一条记录)的情况,如果不对这种情况进行规范操作,数据的一致性和完整性就得不到保证,从而会出现意想不到的结果,所以必须有一种机制对并发访问进行控制和调度,避免造成数据更新不正确。
Oracle锁就是这样一种机制,它是控制并发操作最常用的方法。
Oracle使用锁来防止进程相互之间发生的破坏性影响,当一个进程企图阻止另外一个进程对某条数据操作时,该进程就对这个数据进行锁,别的进程对这个数据操作之前,必须获得这个数据的解锁。
Oracle锁功能是Oracle DBMS自动完成的,不需要用户干预,但Oracle也提供了加锁的命令,供用户使用。
1.1 Oracle锁机制Oracle自动使用不同锁类型来控制数据的并发操作,以防止用户之间的破坏性干扰。
Oracle为一个事务自动锁一个资源,以防止其他事务对同一个资源的排他锁。
当某种条件出现或者事务不再需要该资源时,锁自动解除。
Oracle自动获取不同类型的锁取决于锁的资源及其所执行的操作。
其中包括数据锁(DML)、字典锁(DDL)、内部锁、人工锁定、分布锁和并行缓冲管理锁。
1.1.1数据锁(DML)模式数据锁保证表中数据在多个用户并发操作数据时保证数据的完整性,并防止相冲突的DML和DDL操作的破坏性干扰。
DML操作可在两个级别获取数据锁:行级锁(TX)和表级锁(TM)。
表级锁有以下几种方式●空Null,即无锁。
●行共享表锁(RS)行共享表锁(有时也叫SS),表明事务保持已锁表行的表锁,并试图修改数据。
这种锁是在执行以下命令的时自动获取:Select …From 表名… for update for …;Lock Table 表名 in Row Share Mode;当一个事务在一个表持有行共享锁的时候,允许其他事务并行查询、插入、修改或者删除及再进行行锁,但禁止其他事务以排他方式进行操作该表。
Oracle LOCK内部机制及最佳实践系列(四)深入分析mode 2-6 的TM锁相互间的互斥关系

深入分析mode 2-6 的TM锁相互间的互斥关系Oracle TM锁的类型锁模式锁描述含义锁定表的SQL 0None1Null空,本模式是oracle预留模式2Row Share(RS)又叫(SS)行级共享锁,是限制最少的TM锁,可以提供最高程度的并发性。
其他会话可以对锁定的表进行任何类型的DML操作,还可以与其他会话锁并存Lock table t in row share mod3Row Exclusive TableLock(RX)又叫(SX)行级排他锁,通常已经有事务在修改行或者select…forupdate 修改结果集。
允许其他事务对锁定的表进行select insert update delete 或 lock table 同时锁定一张表Lock table t in row exclusive m4Share Table Lock(S)共享锁,其他事务可以查询锁定的表但不能修改,只允许当前事务修改,但可以多个事务持有它Lock table t in share mode;5Share Row ExclusiveTable Lock(SRX)又叫SSX共享行级排他锁,同一时间只允许一个事务持有和修改锁定的表,其他事务可以查询但不能修改Lock table t in share row exclumode;6Exclusive Table Lock (X)排他锁,是限制最高的TM锁,禁止其他事务执行任何类型的DML语句或者锁表一个表一般只能有一个6号锁Lock table t in exclusive modeOracle锁模式互斥关系图锁模式锁名称允许级别互斥级别2行级共享锁 2 3 4 563行级排他锁 2 3 4 5 64共享锁 2 4 3 5 65共享行级排他锁2 3 4 5 66排他锁 2 3 4 5 6实验锁互斥准备工作LEO1@LEO1> select distinct sid from v$mystat; LEO1用户的会话id=138 SID----------------------------138LEO2@LEO1> select distinct sid from v$mystat; LEO2用户的会话id=156 SID----------------------------156LEO1@LEO1> create table lock1 (x int primary key); 创建lock1表,设置x列为主键Table created.LEO1@LEO1> insert into lock1 values(1); 我们插入11 row created.LEO1@LEO1> commit; 提交Commit complete.LEO1@LEO1> select * from lock1; 现在只有一条记录,并且没有锁X----------------------------1LEO1@LEO1> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM','TX') order by 1,2;no rows selected行级共享锁 Row Share(RS) 2LEO1@LEO1> lock table lock1 in row share mode;把lock1表设置为行级共享锁模式Table(s) Locked.LEO1@LEO1> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM','TX') order by 1,2;SID TYPE ID1 ID2 LMODE REQUEST BLOCK---------- ---------- ---------- ---------- ---------- ---------- -------------------- ---------- ---------- ---------- ---------- ---------- --138 TM 73472 0 20 0模式标识:2LEO1@LEO1> select object_name from dba_objects where object_id=73472; lock1表对象id 为73472OBJECT_NAME----------------------------------------------------------------------------------------------------LOCK1LEO2@LEO1> insert into leo1.lock1 values(2);1 row created.LEO2@LEO1> select * from leo1.lock1;X----------12LEO2@LEO1> delete from leo1.lock1 where x=1;1 row deleted.LEO2@LEO1> select * from leo1.lock1;X----------2LEO2@LEO1>update leo1.lock1 set x=10 where x=2;1 row updated.LEO2@LEO1> select * from leo1.lock1;X----------10LEO2@LEO1> select * from leo1.lock1 for update;X----------10LEO1@LEO1> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM','TX') order by 1,2;SID TYPE ID1 ID2 LMODE REQUEST BLOCK---------- ---------- ---------- ---------- ---------- ---------- -------------- ---------- ---------- ---------- -----------------138 TM 73472 0 20 0156 TM 73472 0 30 0156 TX 524321 936 6 0 0小结:行级共享锁,是限制最少的TM锁,可以提供最高程度的并发性。
数据库中的锁

数据库锁的基本概念为了确保并发用户在存取同一数据库对象时的正确性(即无丢失修改、可重复读、不读“脏”数据),数据库中引入了锁机制。
基本的锁类型有两种:排它锁(Exclusive locks记为X锁)和共享锁(Share locks记为S锁)。
排它锁:若事务T对数据D加X锁,则其它任何事务都不能再对D加任何类型的锁,直至T释放D上的X锁;一般要求在修改数据前要向该数据加排它锁,所以排它锁又称为写锁。
共享锁:若事务T对数据D加S锁,则其它事务只能对D加S锁,而不能加X锁,直至T 释放D上的S锁;一般要求在读取数据前要向该数据加共享锁,所以共享锁又称为读锁。
2 Oracle 多粒度封锁机制介绍根据保护对象的不同,Oracle数据库锁可以分为以下几大类:(1) DML lock(data locks,数据锁):用于保护数据的完整性;(2) DDL lock(dictionary locks,字典锁):用于保护数据库对象的结构(例如表、视图、索引的结构定义);(3) internal locks 和l a t c h es(内部锁与闩):保护内部数据库结构;(4) distributed locks(分布式锁):用于OPS(并行服务器)中;(5) PCM locks(并行高速缓存管理锁):用于OPS(并行服务器)中。
本文主要讨论DML(也可称为data locks,数据锁)锁。
从封锁粒度(封锁对象的大小)的角度看,Oracle DML锁共有两个层次,即行级锁和表级锁。
2.1 Oracle的TX锁(行级锁、事务锁)许多对Oracle不太了解的技术人员可能会以为每一个TX锁代表一条被封锁的数据行,其实不然。
TX的本义是Transaction(事务),当一个事务第一次执行数据更改(Insert、Update、Delete)或使用SELECT… FOR UPDATE语句进行查询时,它即获得一个TX(事务)锁,直至该事务结束(执行COMMIT或ROLLBACK操作)时,该锁才被释放。
Enqueue Lock介绍

下面分别是一个TX锁与TM锁的例子
– TX-393237-184 – TM-6317-0
Enqueue Lock模式
模式 Null SS SX S SSX X 内部编号 KSQMNull KSQMSS KSQMSX KSQMS KSQMSSX KSQMX 模式值 1 2 3 4 5 6 描述(以 为例来说明) 描述 以DML为例来说明 为例来说明 Null模式,不妨碍任何并发访问,主要用来 作为Cache Invalidate的通知机制存在 SubShare模式,使用共享模式锁住一条记 录 SubExclusive模式,使用独占模式锁住一条 记录 共享模式 Share,SubExclusive,对表持有共享锁,对其 中的记录持独占模式 Exclusive模式,对全表持独占模式
相关视图介绍
Lock相关的视图信息,不会自动创建,需要执 行catblock.sql
Dba_lock 基本锁信息 Dba_lock_internal 包含内部锁(library cache pin/lock)以及latch Dba_dml_locks 仅显示TM锁信息,不过同时关联此锁对应的 TM , Dba_ddl_locks 仅显示library cache lock锁,也即基本对象做ddl涉及到 的锁 – Dba_waiters,dba_blockers 显示持有或者被阻塞的锁信息 – – – –
获取Enqueue Lock的步骤(2)
释放Enqueue Lock的步骤
计算hash值,确定所需访问资源所在的链表 得到对应的enqueue hash chains latch 定位此资源 获取enqueues latch 将lock结构从Enqueue Resource结构上取出 释放Enqueues latch 通知处在等待(转换)队列上的进程(如果有的话) 如果可能,释放此Enqueue Resource,并将其放入 空闲资源列表 释放enqueue hash chains latch
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
o r a c l e的T M锁、T X锁知识完全普及锁概念基础
数据库是一个多用户使用的共享资源。
当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。
若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。
加锁是实现数据库并发控制的一个非常重要的技术。
当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。
加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。
在数据库中有两种基本的锁类型:排它锁(ExclusiveLocks,即X锁)和共享锁(ShareLocks,即S锁)。
当数据对象被加上排它锁时,其他的事务不能对它读取和修改。
加了共享锁的数据对象可以被其他事务读取,但不能修改。
数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。
Oracle数据库的锁类型
根据保护的对象不同,Oracle数据库锁可以分为以下几大类:DML锁(datalocks,数据锁),用于保护数据的完整性;DDL锁(dictionarylocks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;内部锁和闩(internallocksandlatches),保护数据库的内部结构。
DML锁的目的在于保证并发情况下的数据完整性,。
在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。
当Oracle执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。
当TM锁获得后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位。
这样在事务加锁前检查TX 锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。
TM锁包括了SS、SX、S、X等多种模式,在数据库中用0-6来表示。
不同的SQL操作产生不同类型的TM锁。
在数据行上只有X锁(排他锁)。
在Oracle数据库中,当一个事务首次发起一个DML语句时就获得一个TX锁,该锁保持到事务被提交或回滚。
当两个或多个会话在表的同一条记录上执行DML语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。
当第一个会话提交后,TX锁被释放,其他会话才可以加锁。
当Oracle数据库发生TX锁等待时,如果不及时处理常常会引起Oracle数据库挂起,或导致死锁的发生,产生ORA-60的错误。
这些现象都会对实际应用产生极大的危害,如长时间未响应,大量事务失败等。
悲观封锁和乐观封锁
一、悲观封锁
锁在用户修改之前就发挥作用:
Select..forupdate(nowait)
Select*fromtab1forupdate
用户发出这条命令之后,oracle将会对返回集中的数据建立行级封锁,以防止其他用户的修改。
如果此时其他用户对上面返回结果集的数据进行dml或ddl操作都会返回一个错误信息或发生阻塞。
1:对返回结果集进行update或delete操作会发生阻塞。
2:对该表进行ddl操作将会报:Ora-00054:resourcebusyandacquirewithnowaitspecified.
原因分析
此时Oracle已经对返回的结果集上加了排它的行级锁,所有其他对这些数据进行的修改或删除操作都必须等待这个锁的释放,产生的外在现象就是其他的操作将发生阻塞,这个这个操作commit 或rollback.
同样这个查询的事务将会对该表加表级锁,不允许对该表的任何ddl操作,否则将会报出ora-00054错误::resourcebusyandacquirewithnowaitspecified.
二、乐观封锁
乐观的认为数据在select出来到update进取并提交的这段时间数据不会被更改。
这里面有一种潜在的危险就是由于被选出的结果集并没有被锁定,是存在一种可能被其他用户更改的可能。
因此Oracle仍然建议是用悲观封锁,因为这样会更安全。
阻塞
定义:
当一个会话保持另一个会话正在请求的资源上的锁定时,就会发生阻塞。
被阻塞的会话将一直挂起,直到持有锁的会话放弃锁定的资源为止。
4个常见的dml语句会产生阻塞
INSERT
UPDATE
DELETE
SELECT…FORUPDATE
INSERT
Insert发生阻塞的唯一情况就是用户拥有一个建有主键约束的表。
当2个的会话同时试图向表中插入相同的数据时,其中的一个会话将被阻塞,直到另外一个会话提交或会滚。
一个会话提交时,另一个会话将收到主键重复的错误。
回滚时,被阻塞的会话将继续执行。
UPDATE和DELETE当执行Update和delete操作的数据行已经被另外的会话锁定时,将会发生阻塞,
直到另一个会话提交或会滚。
Select…forupdate
当一个用户发出select..forupdate的错作准备对返回的结果集进行修改时,如果结果集已经被另一个会话锁定,就是发生阻塞。
需要等另一个会话结束之后才可继续执行。
可以通过发出select…forupdatenowait的语句来避免发生阻塞,如果资源已经被另一个会话锁定,则会返回以下错误:Ora-00054:resourcebusyandacquirewithnowaitspecified.
死锁-deadlock
定义:当两个用户希望持有对方的资源时就会发生死锁.
即两个用户互相等待对方释放资源时,oracle认定为产生了死锁,在这种情况下,将以牺牲一个用
户作为代价,另一个用户继续执行,牺牲的用户的事务将回滚.
例子:
1:用户1对A表进行Update,没有提交。
2:用户2对B表进行Update,没有提交。
此时双反不存在资源共享的问题。
3:如果用户2此时对A表作update,则会发生阻塞,需要等到用户一的事物结束。
4:如果此时用户1又对B表作update,则产生死锁。
此时Oracle会选择其中一个用户进行会滚,使另一个用户继续执行操作。
起因:
Oracle的死锁问题实际上很少见,如果发生,基本上都是不正确的程序设计造成的,经过调整后,基本上都会避免死锁的发生。
DML锁分类表
1.关于V$lock表和相关视图的说明
2.其它相关视图说明
select*fromv$lock;
select*fromv$lockwhereblock=1;
2.查询被锁的对象
select*fromv$locked_object;
3.查询阻塞
查被阻塞的会话
select*fromv$lockwherelmode=0andtypein('TM','TX');
查阻塞别的会话锁
select*fromv$lockwherelmode>0andtypein('TM','TX');
4.查询数据库正在等待锁的进程
select*fromv$sessionwherelockwaitisnotnull;
5.查询会话之间锁等待的关系
6.查询锁等待事件
select*fromv$session_waitwhereevent='enqueue';。