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

合集下载

Oracle的五种锁

Oracle的五种锁

Oracle的五种Table LockOracle中的锁定可以分为几类:DML lock(data lock),DDL lock(dictionary lock)和internal lock/latch。

DML lock又可以分为row lock和table lock。

row lock在select.. for update/insert/update/delete时隐式自动产生,而table lock除了隐式产生,也可以调用lock table in name来显示锁定。

如果不希望别的session lock/insert/update/delete表中任意一行,只允许查询,可以用lock table table_name in exclusive mode。

(X)这个锁定模式级别最高,并发度最小。

如果允许别的session查询或用select for update锁定记录,不允许insert/update/delete,可以用lock table table_name in share row exclusive mode。

(SRX)如果允许别的session查询或select for update以及lock table table_name in share mode,只是不允许insert/update/delete,可以用lock table table_name in share mode。

(share mode和share row exclusive mode的区别在于一个是非抢占式的而另一个是抢占式的。

进入share row exclusive mode后其他session不能阻止你insert/update/delete,而进入share mode后其他session也同样可以进入share mode,进而阻止你对表的修改。

(S)还有两种锁定模式,row share(RS)和row exclusive(RX)。

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锁原理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中锁的产生和解锁

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的TM锁T锁知识完全普及

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

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 updatenowaitSelect 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语句会产生阻塞INSERTUPDATEDELETESELECT…FOR U PDATEINSERTInsert发生阻塞的唯一情况就是用户拥有一个建有主键约束的表;当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 - none1 - null NULL2 - row-S SS3 - row-X SX4 - share S5 - S/Row-X SSX6 - exclusive X--大于0时表示当前会话以某种模式占有该锁,等于0时表示当前会话正在等待该锁资源,即表示该会话被阻塞;--往往在发生TX锁时,伴随着TM锁,比如一个sid=9会话拥有一个TM锁,一般会拥有一个或几个TX锁,但他们的id1和id2是不同的,请注意Lock mode in which the process requests the lock:0 - none1 - null NULL2 - row-S SS3 - row-X SX4 - share S5 - S/Row-X SSX6 - exclusive X--大于0时,表示当前会话被阻塞,其它会话占有改锁的模式2.其它相关视图说明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 bwhere = and = and =1and =0;6.查询锁等待事件select from v$session_wait where event='enqueue';。

Oracle LOCK内部机制及最佳实践系列(四)深入分析mode 2-6 的TM锁相互间的互斥关系

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锁,可以提供最高程度的并发性。

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

o r a c l e的T M锁T锁知
识完全普及
集团标准化办公室:[VV986T-J682P28-JP266L8-68PNN]
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.其它相关视图说明
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';。

相关文档
最新文档