当前位置:文档之家› oracle的TM锁TX锁知识完全普及

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

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

o r a c l e的T M锁T X锁

知识完全普及

Revised final draft November 26, 2020

o 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用止其他用户的修改。如果此时其他用户对上面返回结果集的数据进行dml或ddl操作都会返回一个错误信息2:对该表进行ddl操作将会报:Ora-00054:resourcebusyandacquirewithnowaitspecified.

原因分析此时Oracle已经对返回的结果集上加了排它的行级锁,所有其他对这些数据进行的修改或删除操塞,这个这个操作commit或rollback.同样这个查询的事务将会对该表加表级锁,不允许对该表的任何dd 误::resourcebusyandacquirewithnowaitspecified.

二、乐观封锁乐观的认为数据在select出来到update进取并提交的这段时间数据不会被更改。这里面有一其他用户更改的可能。因此Oracle仍然建议是用悲观封锁,因为这样会更安全。

阻塞

定义:当一个会话保持另一个会话正在请求的资源上的锁定时,就会发生阻塞。被阻塞的会话将一直挂起,INSERTUPDATEDELETESELECT…FORUPDATE

INSERT

Insert发生阻塞的唯一情况就是用户拥有一个建有主键约束的表。当2个的会话同时试图向表中插入相同个会话提交时,另一个会话将收到主键重复的错误。回滚时,被阻塞的会话将继续执行。

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

Select…forupdate

当一个用户发出select..forupdate的错作准备对返回的结果集进行修改时,如果结果集已经被另一个会话过发出select…forupdatenowait的语句来避免发生阻塞,如果资源已经被另一个会话锁定,则会返回以下

死锁-deadlock

定义:当两个用户希望持有对方的资源时就会发生死锁.即两个用户互相等待对方释放资源时,oracle认定为执行,牺牲的用户的事务将回滚.例子:1:用户1对A表进行Update,没有提交。2:用户2对B表进行Up A表作update,则会发生阻塞,需要等到用户一的事物结束。4:如果此时用户1又对B表作update,则产行操作。起因:Oracle的死锁问题实际上很少见,如果发生,基本上都是不正确的程序设计造成的,经过调

DML锁分类表

1.关于V$lock表和相关视图的说明

Lockmodeinwhichthesessionholdsthelock:

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锁,一般会Lockmodeinwhichtheprocessrequeststhelock:

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*fro select*fromv$lockwherelmode=0andtypein('TM','TX');查阻塞别的会话锁select*fromv$lockwherelmod select*fromv$sessionwherelockwaitisnotnull;5.查询会话之间锁等待的关系

select a.sidholdsid,b.sidwaitsid,a.type,a.id1,a.id2,a.ctime from v$locka,v$lockb

where a.id1=b.id1and a.id2=b.id2and a.block=1and b.block=0;

6.查询锁等待事件select*fromv$session_waitwhereevent='enqueue';

相关主题
文本预览
相关文档 最新文档