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
一文搞懂Oracle0至6级锁(附案例详解)
一文搞懂Oracle0至6级锁(附案例详解)11g Concepts中摘录的锁的信息Table Locks (TM)A table lock, also called a TM lock, is acquired by a transaction when a table is modified by an INSERT, UPDATE, DELETE, MERGE, SELECT with the FOR UPDATE clause, or LOCK TABLE statement. DML operations require table locks to reserve DML access to the table on behalf of a transaction and to prevent DDL operations that would conflict with the transaction.当事务通过INSERT、UPDATE、DELETE、MERGE和FOR UPDATE对表进行修改时,就会获得一个表锁,也称为TM锁子句,或锁表语句。
DML操作需要表锁来为事务保留对表的DML访问权限,并防止DDL与事务冲突的操作。
A table lock can be held in any of the following modes:Row Share (RS)This lock, also called a subshare table lock (SS), indicates that the transaction holding the lock on the table has locked rows in the table and intends to update them. A row share lock is the least restrictive mode of table lock, offering the highest degree of concurrency for a table.这个锁,也称为子共享表锁(SS),表示持有表上锁的事务已锁定表中的行并打算锁定更新它们。
精通Oracle核心技术和项目实战之事务和锁
分布式事务处理
01
分布式事务的概念
分布式事务是指涉及多个数据库或资 源管理器的事务,需要确保这些事务 在全局范围内保持一致性和原子性。
02
Oracle的分布式事务 处理技术
Oracle提供了分布式事务处理的技术和 工具,如两阶段提交协议(2PC)、分 布式数据库管理系统(DDBMS)等, 以支持跨多个数据库和平台的分布式事 务处理。
02
调整隔离级别
根据实际需求调整事务隔离级别 ,减少锁等待时间,提高并发性
能。
04
分布式事务
对于跨多个数据库或服务器的事 务,采用分布式事务解决方案,
提高系统整体性能。
效果评估及持续改进
性能指标监控
定期监控关键性能指标,如事务执行时间、 锁等待时间、资源消耗等。
效果评估
对比优化前后的性能指标,评估优化效果。
一致性(Consistency)
事务是一个原子操作单元,其对数据的修 改要么全都执行,要么全都不执行。
事务必须使数据库从一个一致性状态变换 到另一个一致性状态。
隔离性(Isolation)
持久性(Durability)
在事务进行和完成期间,事务的中间状态 对其他事务是不可见的。
一旦事务提交,则其结果就是永久性的。
03
分布式事务的优化和 管理
为了确保分布式事务的性能和可靠性 ,需要采取一系列优化和管理措施, 如使用高性能的网络通信协议、合理 地配置和管理分布式事务的资源等。
04
项目实战:优化事务性能
案例分析:性能瓶颈识别
01
事务执行时间长
通过分析事务日志和执行计划, 发现某些事务执行时间过长,影 响系统整体性能。
02
oracle的TM锁、TX锁知识完全普及
oracle的TM锁、TX锁知识完全普及锁概念基础数据库是一个多用户使用的共享资源。
当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。
若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。
加锁是实现数据库并发控制的一个非常重要的技术。
当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。
加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他,即SOracleDML TM锁和TX当TX 率。
TM得一个DML语锁被当Oracle数据库发生TX锁等待时,如果不及时处理常常会引起Oracle数据库挂起,或导致死锁的发生,产生ORA-60的错误。
这些现象都会对实际应用产生极大的危害,如长时间未响应,大量事务失败等。
悲观封锁和乐观封锁一、悲观封锁锁在用户修改之前就发挥作用:Select..forupdate(nowait)Select*fromtab1forupdate用户发出这条命令之后,oracle将会对返回集中的数据建立行级封锁,以防止其他用户的修改。
如果此时其他用户对上面返回结果集的数据进行dml或ddl操作都会返回一个错误信息或发生阻塞。
1:对返回结果集进行update或delete操作会发生阻塞。
2此时commit 或错误:Oracle阻塞定义:INSERTUPDATEDELETESELECT…FORUPDATEINSERTInsert发生阻塞的唯一情况就是用户拥有一个建有主键约束的表。
当2个的会话同时试图向表中插入相同的数据时,其中的一个会话将被阻塞,直到另外一个会话提交或会滚。
一个会话提交时,另一个会话将收到主键重复的错误。
回滚时,被阻塞的会话将继续执行。
UPDATE和DELETE当执行Update和delete操作的数据行已经被另外的会话锁定时,将会发生阻塞,直到另一个会话提交或会滚。
Select…forupdate当一个用户发出select..forupdate的错作准备对返回的结果集进行修改时,如果结果集已经被另一个会话锁定,就是发生阻塞。
oracle锁原理
oracle锁原理标题:Oracle锁原理:保证数据一致性和并发性的关键机制引言:在数据库系统中,数据的一致性和并发性是非常重要的。
在多用户并发访问数据库时,可能出现脏读、不可重复读、幻读等问题。
为了解决这些问题,Oracle数据库引入了锁机制,以确保数据的一致性和并发性。
本文将介绍Oracle数据库中锁的原理和不同类型的锁。
一、锁的概念锁是对数据对象(如表、行、页等)的一种保护机制,通过对数据对象施加锁,限制其他事务对其进行修改,以保证数据的一致性和并发性。
锁可分为共享锁(Shared Lock)和排他锁(Exclusive Lock)两种类型。
二、Oracle锁的类型1. 表级锁(Table Level Locks)表级锁是对整个表进行锁定,当一个事务对表进行修改时,会锁定整个表,其他事务无法对该表进行并发操作。
表级锁适用于对整个表进行大规模数据修改的场景,例如表重建、重复数据删除等。
2. 行级锁(Row Level Locks)行级锁是对表中的行进行锁定,当一个事务对某一行进行修改时,会锁定该行,其他事务可以对其他行进行并发操作。
行级锁可以细化锁的粒度,提高并发性能。
Oracle数据库使用行级锁的方式是通过使用“行级共享锁”(RS)和“行级排他锁”(RX)两种类型的锁来实现。
3. 页级锁(Page Level Locks)页级锁是对表的页进行锁定,当一个事务对某一页进行修改时,会锁定该页,其他事务可以对其他页进行并发操作。
页级锁适用于大型表上的并发操作。
三、锁的获取和释放在Oracle数据库中,锁的获取和释放是自动进行的,无需手动干预。
当一个事务需要对一个对象进行修改时,会自动获取相应的锁。
事务提交或回滚后,会自动释放相关的锁。
Oracle数据库的锁管理是一个复杂的内部机制,通过各种算法和数据结构来管理锁的获取和释放。
四、锁的粒度和成本在实际应用中,锁的粒度和成本需要权衡。
如果锁的粒度过大,会导致并发性能下降;如果锁的粒度过小,会导致锁管理的开销增加。
Oracle锁机制内部原理解惑
Oracle锁机制内部解惑Oracle锁机制内部原理解惑从宏观上来讲Oracle的锁机制的帖子已经比较多了,此处,不做宏观上说明,只对Oracle锁机制内幕做一定说明。
Oracle的锁分为5大类:1、DML锁。
2、DDL锁。
3、Latch&mutex&internal lock。
4、分布式锁(Distributed locks)。
5、PCM锁。
本文只讨论前三种锁。
关于DML锁:在Tom的《Export Oracle Database Archicture 9i&10g&11g》将Oracle的DML锁分为两类,包括:TM锁、TX锁。
而在《Dsi405》中,又将Oracle的DML锁分为Row locks、Table Locks。
TM locks=Row locks+Table locks也就是说,在《Dsi405》中,TX锁(事务锁)从DML锁中剔除(或者是因为出于某种原因,觉得没有必要包括进来)了!实际上,row locks和TX锁在内部实现上,联系是非常紧密的,所以,大胆猜测,Dsi的编写者Christine Jeal、Jim Womack可能觉得没有必要把TX锁单独罗列出来。
关于DDL锁:DDL主要分为两大类:1、Row Cache locks(我觉得称为“dictionary cache locks”更恰当一些)。
2、Library Cache locks(Breakable parse locks)。
3、Library Cache pins。
关于Oracle锁定义上的歧义:在Tom的《Export Oracle Database Archicture 9i&10g&11g》中,DML是,Data Manipulation Language的意思。
在《Dsi405》中,DML是Data Manipulation Locks的意思。
在Tom的《Export Oracle Database Archicture 9i&10g&11g》,DDL是Data Definition Language。
oracle 锁的概论
oracle 锁的概论
Oracle数据库中的锁是一种重要的概念,它们用于控制并发访问数据库中的数据。
锁可以分为不同的类型,包括行级锁、表级锁和数据库级锁。
在Oracle中,锁可以用于保护数据的一致性,防止并发事务对同一数据进行不一致的操作。
首先,让我们来谈谈行级锁。
行级锁是针对数据库表中的行进行的锁定操作。
当一个事务需要修改某一行的数据时,它会获取该行的行级锁,这样其他事务就无法同时修改这一行的数据,从而保证了数据的一致性。
行级锁可以通过SELECT ... FOR UPDATE语句来实现,在更新或删除操作时自动获取。
其次,表级锁是针对整个表的锁定操作。
当一个事务需要对整个表进行操作时,它会获取表级锁,这会阻止其他事务对整个表进行修改操作,从而保证了数据的完整性。
表级锁可以通过LOCK TABLE语句来实现。
此外,Oracle还支持数据库级锁,它可以用于对整个数据库进行锁定操作,从而限制其他用户对数据库的访问。
数据库级锁可以通过ALTER SYSTEM语句来实现。
需要注意的是,锁在提高数据一致性的同时也会带来一定的性能损耗。
过多的锁定操作可能会导致数据库的性能下降,因此在设计数据库应用程序时需要合理地使用锁,避免出现死锁等问题。
总的来说,Oracle数据库中的锁是确保数据一致性和完整性的重要手段,不同类型的锁可以用于不同粒度的数据保护,合理地使用锁对于数据库的性能和数据完整性都非常重要。
希望这些信息能够帮助你更好地理解Oracle数据库中的锁机制。
oracle的TM锁TX锁知识完全普及
o r a c l e的T M锁T X锁知识完全普及Revised final draft November 26, 2020o r a c l e的T M锁、T X锁知识完全普及锁概念基础数据库是一个多用户使用的共享资源。
当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存数据,破坏数据库的一致性。
加锁是实现数据库并发控制的一个非常重要的技术。
当事务在对某个数据对象进行操作前,先向系统发出请放锁之前,其他的事务不能对此数据对象进行更新操作。
在数据库中有两种基本的锁类型:排它锁(ExclusiveLocks,即X锁)和共享锁(ShareLocks,即S锁)。
锁的数据对象可以被其他事务读取,但不能修改。
数据库利用这两种基本的锁类型来对数据库的事务进行并Oracle数据库的锁类型根据保护的对象不同,Oracle数据库锁可以分为以下几大类:DML锁(datalocks,数据锁),用于保护数的结构,如表、索引等的结构定义;内部锁和闩(internallocksandlatches),保护数据库的内部结构。
DML锁的目的在于保证并发情况下的数据完整性,。
在Oracle数据库中,DML锁主要包括TM锁和TX锁,其当Oracle执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。
当TM锁获得后,系统再自动申加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统表示。
不同的SQL操作产生不同类型的TM锁。
在数据行上只有X锁(排他锁)。
在Oracle数据库中,当一个事务首次发起一个DML语句时就获得一个T 上执行DML语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。
当第一个会话提交后,TX当Oracle数据库发生TX锁等待时,如果不及时处理常常会引起Oracle数据库挂起,或导致死锁的发生,未响应,大量事务失败等。
悲观封锁和乐观封锁一、悲观封锁锁在用户修改之前就发挥作用:Select..forupdate(nowait)Select*fromtab1forupdate用止其他用户的修改。
lock 锁
lock 锁1锁的作用和分类1.1锁的作用锁为了避免资源竞争控制并发说白了就是保护自己+限制别人1.2锁的基本分类按照锁级别:TM表(共享)TX行(排他)按操作划分:DML锁update table t1 共享DDL锁alter table t1规定类型模式0-6 7内部闩锁:这是ORACLE中的一种特殊锁,用于顺序访问内部系统结构。
当事务需向缓冲区写入信息时,为了使用此块内存区域,ORACLE首先必须取得这块内存区域的闩锁,才能向此块内存写入信息。
1.3锁的基本说明记住:在oracle里select不产生查询保护锁(除了select .. for update; 本节介绍)LATCH涉及不可见的内部对象比如library cacheLATCH 暂时不讲今天只认识DML和DDL锁锁的触发用户执行的DML DDL操作间接触发用户执行的lock table .....语句直接触发DML锁也就是INSERT,UPDATE,DELETE,select FOR UPDATE操作产生的锁DML执行就会产生事务所以锁和事务是分不开的DML锁目的就用来控制多个session(不一定是多个用户)并行访问的数据时一致性的.确保在某一事务期间修改的数据,不能被另一个用户修改和编辑DML锁也确保了被修改中的表(事务未结束) 不能做DDLDML锁的两种类型DML针对的对象通常是表表又分为行和列数据存储是以行记录模式存储在块里的DML就是操作表中的行所以DML锁分为:表级锁TM (table management)行级锁TX (transaction exclusive)锁的信息可以通过如下性能视图查得v$lockv$locked_objectdba_blockersdba_waitersdba_dml_locksdba_ddl_locks1.4测试实验认识TM,TX锁和阻塞认识外键有索引的必要性启用三个会话sessionA sessionB 互动操作产生现象session C查看锁资源SQL>conn scott/sekerConnected.SQL> set sqlp 'session A:> 'session A:>session A:> select distinct sid from v$mystat;SID----------151session A:>SQL>conn scott/sekerConnected.SQL> set sqlp 'session B:> 'session B:>session B:> select distinct sid from v$mystat;SID----------146session B:>SQL>conn scott/sekerConnected.SQL> set sqlp 'LOOK C:> 'LOOK C:>先查看AB没有操作没有锁产生LOOK C:> select * from v$lock where sid in (143,159);no rows selectedLOOK C:>操作session A:> delete emp where ename='SCOTT';1 row deleted.session A:>查看LOOK C:> select * from v$lock where sid in (151,146);ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK-------- -------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------2F9C3F90 2F9C3FA8 151 TM 51146 0 2 0 9 0 2F9C403C 2F9C4054 151 TM 51148 0 3 0 9 0 2FA25948 2FA25A64 151 TX 655373 307 6 0 9 0LOOK C:>LOOK C:> select OBJECT_NAME,OBJECT_ID from user_objects where OBJECT_ID in (52506,52508);OBJECT_NAME OBJECT_ID-------------------- ----------DEPT 51146EMP 51148LOOK C:>A操作的是emp中的一行,所以会有TX锁SCOTT这一行另外两个TM呢? 分别在EMP和dept上DEPT为什么有表锁?因为他们有主外键约束关系从外键删除数据,主键表会被锁,我再调配这个部门的员工你不能此时把这个部门删掉. session B:> delete emp where ename='SCOTT';被阻塞因为这一行被A锁住了B的操作遭到了A的排斥LOOK C:> select * from v$lock where sid in (159,143);ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK-------- -------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------30FB9B44 30FB9B58 146 TX 196647 370 0 6 34 0 2F9C3F90 2F9C3FA8 151 TM 51146 0 2 0 244 0 2F9C403C 2F9C4054 151 TM 51148 0 3 0 244 0 2F9C40E8 2F9C4100 146 TM 51146 0 2 0 34 0 2F9C4194 2F9C41AC 146 TM 51148 0 3 0 34 0 2FA25948 2FA25A64 151 TX 196647 370 6 0 244 16 rows selected.LOOK C:>A的TX锁阻塞了另一个会话从BLOCK 1 能看出获取阻塞信息select(select username from v$session where sid=a.sid) blocker,a.sid,' is blocking ',(select username from v$session where sid=b.sid) blockee,b.sidfrom v$lock a, v$lock bwhere a.block = 1and b.request > 0and a.id1 = b.id1and a.id2 = b.id2session B:> delete emp where ename='SCOTT';delete emp where ename='SCOTT'*ERROR at line 1:ORA-01013: user requested cancel of current operationsession B:> rollRollback complete.session B:>B执行ctrl+c中断并回滚锁被释放LOOK C:> select * from v$lock where sid in (151,146);ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK-------- -------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------2F9C3F90 2F9C3FA8 151 TM 51146 0 2 0 346 0 2F9C403C 2F9C4054 151 TM 51148 0 3 0 346 0 2FA25948 2FA25A64 151 TX 196647 370 6 0 346 0LOOK C:>session B:> delete emp where ename='KING';1 row deleted.session B:> rollRollback complete.session B:>B再去删KING的行没问题因为这一行没有被锁oracle优势之一就是实现的是行级锁session B:> delete dept where 0=1;被阻塞LOOK C:> select * from v$lock where sid in (151,146);ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK-------- -------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------2F9C3F90 2F9C3FA8 151 TM 51146 0 2 0 478 0 2F9C403C 2F9C4054 151 TM 51148 0 3 0 478 1 2F9C40E8 2F9C4100 146 TM 51146 0 3 0 18 02F9C4194 2F9C41AC 146 TM 51148 0 0 4 18 0 2FA25948 2FA25A64 151 TX 196647 370 6 0 478 0LOOK C:>A的DEPT上的TM锁阻塞了一个会话从BLOCK 1看出这次的阻塞和外键有关系我们是可以提前避免这次的阻塞的,原因是外键上无索引中断Bsession B:> delete dept where 0=1;delete dept where 0=1*ERROR at line 1:ORA-01013: user requested cancel of current operationsession B:> rollRollback complete.session B:>回滚Asession A:> rollRollback complete.session A:>释放所有锁,我们给外键加索引,重新开始刚才的测试session A:> create index emp_deptno_idx on emp(deptno);Index created.session A:> delete emp where ename='SCOTT';1 row deleted.session A:>session B:> delete dept where 0=1;0 rows deleted.session B:>这次B没有被阻塞可见外键列有索引的必要性自己用上面的例子试试选定更新意想行select ... for update;(10G DML)BJ==>GZ1 lockselect *from t1 where x=6;select *from t1 where x=6 for update;就知道什么是select for update了select for update 选定有意向更新TM锁本身不会对行上加锁,要区分表级锁和行级锁,但是下图中的语句会同时触发表级锁和行级锁一个事务DML操作涉及了多少对象,就有多少个TM锁,我们可以通过参数限制这个TM锁数量session B:> show parameter dml_lockNAME TYPE VALUE------------------------------------ ----------- ------------------------------dml_locks integer 748session B:>当改成0时就只有TX 没有TMsession B:> conn / as sysdbaConnected.session B:> alter system set dml_locks=0 scope=spfile;System altered.session B:> shut abortORACLE instance shut down.session B:> startupORACLE instance started.Total System Global Area 285212672 bytesFixed Size 1218992 bytesVariable Size 96470608 bytesDatabase Buffers 184549376 bytesRedo Buffers 2973696 bytesDatabase mounted.Database opened.session B:> update scott.emp set sal=sal+1 ;14 rows updated.session B:> select distinct sid from v$mystat;SID----------159session B:> set line 100session B:> select * from v$lock where sid in (159);ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK-------- -------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------2F9E31AC 2F9E32C8 159 TX 65549 307 6 0 51 0 session B:>但这种情况太极端了,数据库此时不能做DDL语句,当你的库确定不再做DDL时可以这样,很高效.session B:> drop table scott.emp;drop table scott.emp*ERROR at line 1:ORA-00062: DML full-table lock cannot be acquired; DML_LOCKS is 0session B:>把参数恢复成默认748. 重新启库正常模式DDL 锁DDL是数据字典锁数据字典中存在着对象的定义防止表定义被并发更改DDL锁分专有锁共享锁可破碎的解析锁breakable parsed lock当存储过程或执行计划产生时会在所涉及到的对象上加可破碎的解析锁DDL专有锁DDL锁存放在它引用的对象上的,以阻止在该对象上添加TM锁。
oracle数据库闩锁锁定与并发专题
Oracle并发和latch专题Oracle本身是一个多用户并发处理系统,在同一个时间点上,可能会有多个用户同时操作数据库,这就涉及两个重要的问题1、这些用户之间的操作不会互相破坏,比如两个用户同时在相同的物理位置上写数据时,不能发生互相覆盖的情况,这叫做串行化,也就是说,即便两个用户同时在写,也必须有先后,一个用户写完,另一个用户继续写,串行化会降低系统的并发性,但这对保护数据结构不被破坏来说则是必须的2、在满足串行化的前提下,如何将并发性提升到最大Oracle中通过使用闩锁(latch)和锁定(lock)Latch和lock都是实现串行化的方法latch是一个低级别的,轻量级的锁,获得和释放的速度都很快lock可能持续很长时间,通过使用队列,先进先出的方式实现锁的白话意义:一种资源,如果可能发生多个进程同时访问的情况,造成资源的破坏,那么就需要给这种资源上一个锁,如果这种资源很简单,例如就是内存的分配和释放,那么就使用latch,如果这种资源相对复杂,有一定的逻辑判断,那么就需要使用lock资源的意义很广泛,因为进程总是通过内存来做修改、读取,因此资源都分布在内存中。
闩锁的概述(latch)Oracle使用闩锁来实现内存的分配和释放例如某个用户进程A发出一条update语句,要去更新58号数据块里的某条记录,则该用户进程对应的服务器进程在写内存的时候,找到58号数据块,并往里写内容,A在写58号数据块的过程中,这时另外一个用户进程B发出insert语句,要将某个新的记录插入到58号数据块中,如果没有一定的保护机制,A正要写入的空间可能被B抢先写入,B要写入的空间可能被A抢先写入,不管哪个用户先抢先写入,造成的结果就是,58号数据块的数据都混乱了如果使用latch来进行保护,简单的描述,任何进程要写数据块时,都必须先获得latch,在写入过程中,一直持有latch,写完以后,释放latch当A在写入58号数据块的时候,先获得latch,B也要写58号数据块,这时B尝试获得latch,发现该latch被A持有,B进入等待状态,直到A释放latch,B获得latch以后,才能在58号数据块中写入数据Latch用来锁住内存中的数据结构的,例如buffer,share pool,只要访问就有锁,因此latch 是快速的锁,latch锁的是资源不是数据块,latch保护的是资源的分配和释放不只是写数据块需要使用latch,shared pool中就没有数据块。
ORACLE基础之oracle锁(oraclelockmode)详解
ORACLE基础之oracle锁(oraclelockmode)详解ORACLE⾥锁有以下⼏种模式:0:none1:null 空2:Row-S ⾏共享(RS):共享表锁,sub share3:Row-X ⾏独占(RX):⽤于⾏的修改,sub exclusive4:Share 共享锁(S):阻⽌其他DML操作,share5:S/Row-X 共享⾏独占(SRX):阻⽌其他事务操作,share/sub exclusive6:exclusive 独占(X):独⽴访问使⽤,exclusive1.oracle提供的所类型可以根据v$lock_type 中的type来查询,我们平时接触的最多的是两种select * from v$lock_type where type in ('TM','TX')查看描述,可以⼤概的得知两种锁的信息.TM是同步访问对象⽤的,TX是和事务有关的.2.要知道的有2个概念:(1).锁定数据的锁,也就是⾏级锁,只有⼀种:排它锁 exclusive (ROW)(2).锁定表上的锁,即锁定元数据的锁 metadata(table),⼀共有5种:RS: row shareRX: row exclusiveS: shareSRX: share row exclusiveX: exclusive4.根据oracle联机⽂档的concepts的 我们可以从这个表找出⾄少2个东西,.第⼀是每种数据库操作都对应的是什么样的锁(参考中间那⼀列),第⼆是每种锁之间,如果遇到之后是否会产⽣冲突,所谓冲突就是是否会使当前的数据库操作夯住.其中Y*,表⽰如果两个操作锁定的是同⼀⾏,那么就会有冲突,后操作的会等待前⼀个操作完成之后再完成,否则会⼀直夯在那⼉;如果不为同⼀⾏,那么则不会冲突,后操作的不会等待.举⼀个例⼦来说明:假设现在A操作为:对id=1的记录进⾏update,⽽B操作为:对id=2的记录进⾏删除,根据表格说明,在A上操作时在TM级别的锁会是RX,TX级别只有⼀个是X,在B上会有⼀个TM级别的锁会是RX,TX级别只有⼀个X,⽽根据表格说明,当RX遇到RX的时候,如果2个操作⾮同⼀条记录,那么则不会冲突,故AB两个操作均会按照各⾃的先加⼀个TM锁,再加⼀个TX锁,再顺利执⾏各⾃的操作,不会夯住。
Oracle 表级锁(TM锁)
Oracle 表级锁(TM锁)假设某个用户(假设为A)发出如下的语句更新一条记录:SQL> update employees set last_name='HanSijie'where employee_id=100;上面的例子,这时A用户已经发出了更新employee_id为100的记录的SQL语句。
当A还没有提交之前,另外一个用户D发出下面的语句:SQL> drop table employees;由于用户A还没有提交所做的事务,因此该事务还没有结束,其他用户还不能删除该表,否则A所发出的事务就无法正常结束。
为了阻止这时用户D的删除操作,我们能够想到的最直观的方法就是,在执行删除表的命令之前,先依次检查employees表里的每一条记录,查看每一条数据行的头部是否存在锁定标记,如果是,则说明当前正有事务在更新该表,删除表的操作必须等待。
显然,这种方式会引起很大的性能问题,Oracle不会采用这种方式。
实际上,当我们在对employees表的数据进行更新时,不仅会在数据行的头部记录行级锁,而且还会在表的级别上添加一个表级锁。
那么当D用户要删除表时,发现employees表上具有一个表级锁,于是等待。
通过这种在表级别上添加锁定的方式,我们就能够比较容易并且高效地(因为不需要扫描表里的每一条记录来判断在表上是否有DML事务)对锁定进行管理了。
表级锁共具有五种模式,如下所示。
行级排他锁(Row Exclusive,简称RX锁)当我们进行DML时会自动在被更新的表上添加RX锁,或者也可以通过执行lock命令显式的在表上添加RX锁。
在该锁定模式下,允许其他的事务通过DML语句修改相同表里的其他数据行,或通过lock命令对相同表添加RX锁定,但是不允许其他事务对相同的表添加排他锁(X锁)。
行级共享锁(Row Shared,简称RS锁)通常是通过select … from for update语句添加的,同时该方法也是我们用来手工锁定某些记录的主要方法。
- 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';。