oracle的TM锁、TX锁知识完全普及

合集下载

oracle数据库中锁、序列、索引管理

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中锁的产品和解锁文档修改记录版本号日期说明编写者审核者V1.0 20110822 初稿周伟明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锁原理

oracle锁原理

Oracle锁原理详解1. 概述在Oracle数据库中,锁是用于控制并发访问的一种机制。

当多个用户同时访问数据库时,为了保证数据的一致性和完整性,Oracle会对数据进行加锁,以防止其他用户对数据的修改。

本文将详细介绍Oracle锁的基本原理。

2. 锁的类型Oracle中的锁可以分为两种类型:共享锁(Shared Lock)和排他锁(Exclusive Lock)。

•共享锁:多个事务可以同时获取共享锁,并且可以并发读取数据,但不能修改数据。

共享锁用于保证数据的一致性,即多个事务可以同时读取相同的数据,但不能同时修改数据。

•排他锁:只有一个事务可以获取排他锁,并且其他事务不能同时获取共享锁或排他锁。

排他锁用于保证数据的完整性,即一个事务在修改数据时,其他事务不能同时读取或修改数据。

3. 锁的级别Oracle中的锁可以分为多个级别,包括表级锁、行级锁和字段级锁。

•表级锁:锁定整个表,阻止其他事务对表的修改。

表级锁对于大型表来说,可能会导致性能问题,因为它会阻塞其他事务的访问。

•行级锁:锁定表中的一行数据,其他事务可以并发读取其他行的数据。

行级锁可以更细粒度地控制并发访问,但可能会导致死锁问题。

•字段级锁:锁定表中的一个或多个字段,其他事务可以并发读取或修改其他字段的数据。

字段级锁可以进一步细化锁的粒度,但也可能导致死锁问题。

4. 锁的控制Oracle中的锁由数据库管理系统(DBMS)自动控制,用户无需手动操作。

当一个事务对数据进行修改时,DBMS会自动为该数据加上相应的锁,并在事务提交或回滚后释放锁。

锁的控制是通过锁定机制和并发控制机制实现的。

•锁定机制:当一个事务对数据进行修改时,DBMS会自动为该数据加上相应的锁。

锁定机制可以保证在并发访问时,每个事务都能正确地读取和修改数据。

•并发控制机制:当多个事务同时访问数据库时,DBMS会根据事务的隔离级别来控制并发访问。

并发控制机制可以避免脏读、不可重复读和幻读等问题。

oracle的TM锁TX锁知识完全普及

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 锁的介绍一、什么是锁:Oracle的锁机制是一种轻量级的锁定机制,不是通过构建锁列表来进行数据的锁定管理,而是直接将锁作为数据块的属性,存储在数据块首部。

这个是通过ITL来实现的,一个事务要修改块中的数据,必须获得该块中的一个itl。

二、为什么需要锁:oracle为什么好好的要搞一个锁(l ock)机制出来呢?很简单,那是因为需要它。

想想看我们自己家的门为什么要锁起来呢?这个我们肯定都知道怕家里的东西丢失或被别人拿走,如果没有别的人家世界就你一家那就没有必要锁门。

oracl e里锁也是一个道理,如果是单用户的系统,那完全没有必要这个锁,就是因为有多用户并发操作,我们为了确保资源的安全性(也就是oracl e的数据完整性和一致性)才引申出这个锁出来。

Oracle 利用其锁机制来实现事务间的数据并发访问及数据一致性。

三、锁的模式:oracl e有两种模式的锁:排他锁(exclusive lock,即X锁)和共享锁(share l ock,即S锁)。

南京宝云ocp课程开课啦~当数据对象被加上排它锁时,其他的事务不能对它读取(可以读取und o)和修改。

加了共享锁的数据对象可以被其他事务读取,但不能修改。

数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。

四、锁的类型:根据保护的对象不同,Oracle数据库锁可以分为以下几大类:DML锁(data locks,数据锁):用于保护数据的完整性。

DDL锁(dictionary l ocks,字典锁):用于保护数据库对象的结构,如表、索引等的结构定义。

内部锁和闩(internal l ocks and latches):保护数据库的内部结构,例如,数据文件。

内部锁及闩锁的管理完全由Oracle 自动完成。

Enqueue Lock介绍

Enqueue Lock介绍
– Type由有两个字母组成,如”TM”,”TX” – Id1与id2为正的数字(4个字节长)
下面分别是一个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

oracle锁

oracle锁

Insert 阻塞
出现INSERT阻塞的情况不多,最常见的情况是,你有一个带 主键的表,或者表上有惟一的约束,但有两个会话试图用同样的值 插入一行。如果是这样,其中一个会话就会阻塞, 直到另一个会话 提交或者回滚为止:如果另一个会话提交,那么阻塞的会话会收到 一个错误,指出存在一个重复值;倘若另一个会话回滚,在这种情 况下,阻塞的会话则会成功。
并发导致锁定的例子
session 1: select sid from v$mystat where rownum=1; create table t(x int primary key); insert into t values(1); commit; update t set x=10 where x=1; session 2: select sid from v$mystat where rownum=1; update t set x=10 where x=1;
死锁
如果你有两个会话,每个会话都持有另一个会话想要的资源, 此时就会出现死锁(deadlock)。例如,如果我的数据库中有两个 表A 和B,每个表中都只有一行,就可以很容易地展示什么是死锁。 我要做的只是打开两个会话。在会话A 中更新表A,并在会话B 中更 新表B。现在,如果我想在会话B 中更新表A,就会阻塞。会话A 已 经锁定了这一行。这不是死锁;只是阻塞而已。如果我再回到会话A ,试图更新表B,这就会导致一个死锁。要在这两个会话中选择一个 作为“牺牲品”,让它的语句回滚。
3.按操作划分,可分为DML锁、DDL锁
DML锁(DML lock):一般来讲, 这表示 SELECT、INSERT、UPDATE、 MERGE 和 DELETE 语句。DML锁机制允许并发执行数据修改。 例如,DML 锁可能是特定数据行上的锁,或者是锁定表中所有行的表级锁。 两类DML锁:TM锁(表级锁)、TX锁(事务锁)。 DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、 索引等的结构定义;如 CREATE和 ALTER语句等。DDL锁可以保护对象结构 定义。 例如, 如果我执行一个DDL操作ALTERTABLE T,表 T上就会加一个排他 DDL锁,以防止其他会话得到这个表的DDL 锁和TM锁。 三类DDL锁:排他DDL锁、共享DDL锁、可中断解析锁。

一文搞懂Oracle0至6级锁(附案例详解)

一文搞懂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),表示持有表上锁的事务已锁定表中的行并打算锁定更新它们。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

oracle的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锁模式的相容性即可,大大提高了系统的效率。

TM锁包括了SS、SX、S、X 等多种模式,在数据库中用0-6来表示。

不同的SQL操作产生不同类型的TM锁。

在数据行上只有X锁(排他锁)。

在 Oracle数据库中,当一个事务首次发起一个DML语句时就获得一个TX锁,该锁保持到事务被提交或回滚。

当两个或多个会话在表的同一条记录上执行 DML语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。

当第一个会话提交后,TX锁被释放,其他会话才可以加锁。

当Oracle数据库发生TX锁等待时,如果不及时处理常常会引起Oracle数据库挂起,或导致死锁的发生,产生ORA-60的错误。

这些现象都会对实际应用产生极大的危害,如长时间未响应,大量事务失
败等。

悲观封锁和乐观封锁
一、悲观封锁
锁在用户修改之前就发挥作用:
Select ..for update(nowait)
Select * from tab1 for update
用户发出这条命令之后,oracle将会对返回集中的数据建立行级封锁,以防止其他用户的修改。

如果此时其他用户对上面返回结果集的数据进行dml或ddl操作都会返回一个错误信息或发生阻塞。

1:对返回结果集进行update或delete操作会发生阻塞。

2:对该表进行ddl操作将会报:Ora-00054:resource busy and acquire with nowait specified.
原因分析
此时Oracle已经对返回的结果集上加了排它的行级锁,所有其他对这些数据进行的修改或删除操作都必须等待这个锁的释放,产生的外在现象就是其他的操作将发生阻塞,这个这个操作commit或rollback.
同样这个查询的事务将会对该表加表级锁,不允许对该表的任何ddl 操作,否则将会报出ora-00054错误::resource busy and acquire with nowait specified.
二、乐观封锁
乐观的认为数据在select出来到update进取并提交的这段时间数据不会被更改。

这里面有一种潜在的危险就是由于被选出的结果集并没有被锁定,是存在一种可能被其他用户更改的可能。

因此Oracle仍然建议是用悲观封锁,因为这样会更安全。

阻塞
定义:
当一个会话保持另一个会话正在请求的资源上的锁定时,就会发生阻塞。

被阻塞的会话将一直挂起,直到持有锁的会话放弃锁定的资源为止。

4个常见的dml语句会产生阻塞
INSERT
UPDATE
DELETE
SELECT…FOR UPDATE
INSERT
Insert发生阻塞的唯一情况就是用户拥有一个建有主键约束的表。

当2个的会话同时试图向表中插入相同的数据时,其中的一个会话将被阻塞,直到另外一个会话提交或会滚。

一个会话提交时,另一个会话将收到主键重复的错误。

回滚时,被阻塞的会话将继续执行。

UPDATE 和DELETE当执行Update和delete操作的数据行已经被另外的会话锁定时,将会发生阻塞,直到另一个会话提交或会滚。

Select …for update
当一个用户发出select..for update的错作准备对返回的结果集进行修改时,如果结果集已经被另一个会话锁定,就是发生阻塞。

需要等另一个会话结束之后才可继续执行。

可以通过发出select… for update nowait的语句来避免发生阻塞,如果资源已经被另一个会话锁定,则会返回以下错误:Ora-00054:resource busy and acquire with nowait specified.
死锁-deadlock
定义:当两个用户希望持有对方的资源时就会发生死锁.
即两个用户互相等待对方释放资源时,oracle认定为产生了死锁,在这种情况下,将以牺牲一个用户作为代价,另一个用户继续执行,牺牲的用户的事务将回滚.
例子:
1:用户1对A表进行Update,没有提交。

2:用户2对B表进行Update,没有提交。

此时双反不存在资源共享的问题。

3:如果用户2此时对A表作update,则会发生阻塞,需要等到用户
一的事物结束。

4:如果此时用户1又对B表作update,则产生死锁。

此时Oracle 会选择其中一个用户进行会滚,使另一个用户继续执行操作。

起因:
Oracle的死锁问题实际上很少见,如果发生,基本上都是不正确的程序设计造成的,经过调整后,基本上都会避免死锁的发生。

DML锁分类表
1.关于V$lock表和相关视图的说明
Lock mode in which the session holds the lock:
0 - none
1 - null (NULL)
2 - row-S (SS)
3 - row-X (SX)
4 - share (S)
5 - S/Row-X (SSX)
6 - exclusive (X)
--大于0时表示当前会话以某种模式占有该锁,等于0时表示当前会话正在等待该锁资源,即表示该会话被阻塞。

--往往在发生TX锁时,伴随着TM锁,比如一个sid=9会话拥有一个TM锁,一般会拥有一个或几个TX锁,但他们的id1和id2是不同的,请注意
Lock mode in which the process requests the lock:
0 - none
1 - null (NULL)
2 - row-S (SS)
3 - row-X (SX)
4 - share (S)
5 - S/Row-X (SSX)
6 - exclusive (X)
--大于0时,表示当前会话被阻塞,其它会
话占有改锁的模式
2.其它相关视图说明
1.查询数据库中的锁
select * from v$lock;
select * from v$lock where block=1;
2.查询被锁的对象
select * from v$locked_object;
3.查询阻塞
查被阻塞的会话
select * from v$lock where lmode=0 and type in ('TM','TX');
查阻塞别的会话锁
select * from v$lock where lmode>0 and type in ('TM','TX');
4.查询数据库正在等待锁的进程
select * from v$session where lockwait is not null;
5.查询会话之间锁等待的关系
select holdsid, waitsid,,,, from v$lock a,v$lock b
where = and = and =1and =0;
6.查询锁等待事件
select * from v$session_wait where event='enqueue';。

相关文档
最新文档