`

Oracle的TX锁(行级锁、事务锁)

 
阅读更多
问题:如何使用事务?
回答:一共有三步。
1、先开启事务。
•在Oracle中,事务是在上一次事务结束以后,数据“第一次”被修改时自动开启。
•在java中,设置连接为手动提交模式开始。代码:
connection.setAutoCommit(false)。

2、进行(多次)数据操作(增删改)……
3、结束事务: commit、rollback。
问题:如何结束事务?
回答:
有两种方法:
1、确认对数据的修改:提交,commit。
2、撤消对数据的修改:回滚,rollback。
另外,当Oracle系统或者PL/SQL脚本抛出异常,都会造成数据回滚。

问题:什么是提交模式,与事务有什么关系?
回答:
提交模式有两种:
自动提交:在每一次数据被修改以后,自动提交。这种模式下是无法支持事务的。
手动提交:所有的数据修改都在内存中,当执行commit时才一起提交。只要有一条sql执行失败,则所有的sql自动回滚。只能在手动提交模式下才能使用事务。



3.1 Oracle的TX锁(行级锁、事务锁)
许多对Oracle不太了解的技术人员可能会以为每一个TX锁代表一条被封锁的数据行,其实不然。TX的本义是Transaction(事务),当一个事务第一次执行数据更改(Insert、Update、Delete)或使用SELECT… FOR UPDATE语句进行查询时,它即获得一个TX(事务)锁,直至该事务结束(执行COMMIT或ROLLBACK操作)时,该锁才被释放。所以,一个TX锁,可以对应多个被该事务锁定的数据行(在我们用的时候多是启动一个事务,然后SELECT… FOR UPDATE NOWAIT)。
在Oracle的每行数据上,都有一个标志位来表示该行数据是否被锁定。Oracle不像DB2那样,建立一个链表来维护每一行被加锁的数据,这样就大大减小了行级锁的维护开销,也在很大程度上避免了类似DB2使用行级锁时经常发生的锁数量不够而进行锁升级的情况。数据行上的锁标志一旦被置位,就表明该行数据被加X锁,Oracle在数据行上没有S锁。
3.2 TM锁(表级锁)
3.2.1 意向锁的引出
表是由行组成的,当我们向某个表加锁时,一方面需要检查该锁的申请是否与原有的表级锁相容;另一方面,还要检查该锁是否与表中的每一行上的锁相容。比如一个事务要在一个表上加S锁,如果表中的一行已被另外的事务加了X锁,那么该锁的申请也应被阻塞。如果表中的数据很多,逐行检查锁标志的开销将很大,系统的性能将会受到影响。为了解决这个问题,可以在表级引入新的锁类型来表示其所属行的加锁情况,这就引出了"意向锁"的概念。
意向锁的含义是如果对一个结点加意向锁,则说明该结点的下层结点正在被加锁;对任一结点加锁时,必须先对它的上层结点加意向锁。如:对表中的任一行加锁时,必须先对它所在的表加意向锁,然后再对该行加锁。这样一来,事务对表加锁时,就不再需要检查表中每行记录的锁标志位了,系统效率得以大大提高。
3.2.2 意向锁的类型
由两种基本的锁类型(S锁、X锁),可以自然地派生出两种意向锁:
意向共享锁(Intent Share Lock,简称IS锁):如果要对一个数据库对象加S锁,首先要对其上级结点加IS锁,表示它的后裔结点拟(意向)加S锁;
意向排它锁(Intent Exclusive Lock,简称IX锁):如果要对一个数据库对象加X锁,首先要对其上级结点加IX锁,表示它的后裔结点拟(意向)加X锁。
另外,基本的锁类型(S、X)与意向锁类型(IS、IX)之间还可以组合出新的锁类型,理论上可以组合出4种,即:S+IS,S+IX,X+IS,X+IX,但稍加分析不难看出,实际上只有S+IX有新的意义,其它三种组合都没有使锁的强度得到提高(即:S+IS=S,X+IS=X,X+IX=X,这里的"="指锁的强度相同)。所谓锁的强度是指对其它锁的排斥程度。
这样我们又可以引入一种新的锁的类型:
共享意向排它锁(Shared Intent Exclusive Lock,简称SIX锁):如果对一个数据库对象加SIX锁,表示对它加S锁,再加IX锁,即SIX=S+IX。例如:事务对某个表加SIX锁,则表示该事务要读整个表(所以要对该表加S锁),同时会更新个别行(所以要对该表加IX锁)。
这样数据库对象上所加的锁类型就可能有5种:即S、X、IS、IX、SIX。
具有意向锁的多粒度封锁方法中任意事务T要对一个数据库对象加锁,必须先对它的上层结点加意向锁。申请封锁时应按自上而下的次序进行;释放封锁时则应按自下而上的次序进行;具有意向锁的多粒度封锁方法提高了系统的并发度,减少了加锁和解锁的开销。
3.3 Oracle的TM锁(表级锁)
Oracle的DML锁(数据锁)正是采用了上面提到的多粒度封锁方法,其行级锁虽然只有一种(即X锁),但其TM锁(表级锁)类型共有5种,分别称为共享锁(S锁)、排它锁(X锁)、行级共享锁(RS锁)、行级排它锁(RX锁)、共享行级排它锁(SRX锁),与上面提到的S、X、IS、IX、SIX相对应。需要注意的是,由于Oracle在行级只提供X锁,所以与RS锁(通过SELECT … FOR UPDATE语句获得)对应的行级锁也是X锁(但是该行数据实际上还没有被修改),这与理论上的IS锁是有区别的。 锁的兼容性是指当一个应用程序在表(行)上加上某种锁后,其他应用程序是否能够在表(行)上加上相应的锁,如果能够加上,说明这两种锁是兼容的,否则说明这两种锁不兼容,不能对同一数据对象并发存取。
下表为Oracle数据库TM锁的兼容矩阵(Y=Yes,表示兼容的请求; N=No,表示不兼容的请求;-表示没有加锁请求):

表五:Oracle数据库TM锁的相容矩阵

一方面,当Oracle执行SELECT…FOR UPDATE、INSERT、UPDATE、DELETE等DML语句时,系统自动在所要操作的表上申请表级RS锁(SELECT…FOR UPDATE)或RX锁(INSERT、UPDATE、DELETE),当表级锁获得后,系统再自动申请TX锁,并将实际锁定的数据行的锁标志位置位(指向该TX锁);另一方面,程序或操作人员也可以通过LOCK TABLE语句来指定获得某种类型的TM锁。下表是笔者总结了Oracle中各SQL语句产生TM锁的情况:
SQL语句       表锁模式        允许的锁模式
Select * from table_name……        无        RS、RX、S、SRX、X
Insert into table_name……         RX        RS、RX
Update table_name……        RX        RS、RX
Delete from table_name……        RX        RS、RX
Select * from table_name for update         RS        RS、RX、S、SRX
lock table table_name in row share mode         RS        RS、RX、S、SRX
lock table table_name in row exclusive mode        RX        RS、RX
lock table table_name in share mode        S        RS、S
lock table table_name in share row exclusive mode        SRX        RS
lock table table_name in exclusive mode        X        无

表六:Oracle数据库TM锁小结

我们可以看到,通常的DML操作(SELECT…FOR UPDATE、INSERT、UPDATE、DELETE),在表级获得的只是意向锁(RS或RX),其真正的封锁粒度还是在行级;另外,Oracle数据库的一个显著特点是,在缺省情况下,单纯地读数据(SELECT)并不加锁,Oracle通过回滚段(Rollback segment)来保证用户不读"脏"数据。这些都提高了系统的并发程度。
由于意向锁及数据行上锁标志位的引入,减小了Oracle维护行级锁的开销,这些技术的应用使Oracle能够高效地处理高度并发的事务请求。
分享到:
评论

相关推荐

    Oracle的锁表与解锁

    1. **TX锁(事务锁)**:这是最常见的锁类型,用于锁定正在修改的数据行,防止其他事务读取或修改同一行数据。这种锁是自动产生的,当一个事务开始修改数据时,Oracle会自动为这些数据行加锁。 2. **TM锁(表级锁)...

    对于Oracle锁的一些理论总结

    此外,Oracle的行级锁实际上是事务级的TX锁,如果一个事务尝试修改已被其他事务更新但未提交的数据,它将等待事务锁的释放,而非行级别的锁。 ITL中的SLOT数量由初始化参数initrans和maxtrans决定,它们在创建对象...

    oracle常见的锁查询和处理

    Oracle数据库的锁机制是保证数据并发访问安全的重要手段,它主要分为行级锁(TX锁)和表级锁(TM锁)。行级锁确保在多用户环境下,同一时间只有一个用户可以更新特定的数据行,而其他用户可以读取,但不能进行修改。...

    oracle锁机制探讨

    在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁(用来保证表的结构不被用户修改),TX锁称为事务锁或行级锁。当Oracle执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后,系统...

    Oracle数据库的锁类型

    DML锁主要关注的是数据级别的锁控,包括TM锁(表级锁)和TX锁(事务锁或行级锁)。这些锁在执行DML(数据操纵语言)操作时自动触发,以确保数据在并发环境下的完整性和一致性。 ##### 1. TM锁:表级锁 TM锁是针对...

    ORACLE锁深入分析

    DML锁用于保护数据的完整性,包括TM锁(表级锁)和TX锁(事务锁或行级锁)。TM锁在执行DML语句时自动申请,对整个表进行锁定,分为SS、SX、S、X四种模式。例如,SS模式是行级共享锁,允许其他事务查询该行数据;SX...

    oracle锁表及解锁

    Oracle中的锁主要有两种类型:表级锁(Table Locks)和行级锁(Row Locks),分别由`TM`和`TX`标识。表级锁通常用于DML操作或DDL操作,而行级锁则是在执行更新、插入或删除等操作时自动产生的。 #### 检查锁定情况 ...

    Oracle数据库锁的研究.pdf

    在事务进行DML操作时,Oracle会自动施加行级锁。 - 表级锁:锁定整个表,确保表结构在其他事务操作期间不变。执行DDL或DML操作时,Oracle会自动为表加上表级锁。表级锁有多种类型,如行共享、行排他、共享锁、共享...

    理解ORACLE数据库锁机制高效维护医院信息系统运行.pdf

    本文主要探讨Oracle数据库中的TM锁和TX锁机制,以及如何解决由锁引起的事务阻塞问题。 首先,Oracle的TM(Transaction Manager)锁机制是用于控制事务对数据的并发访问。TM锁主要有四种类型:SS(Shared Shared)、...

    ORACLE关于锁和V$LOCK的分析.docx

    * TYPE:锁的类型,其中 TM 表示表锁或 DML 锁,TX 表示行锁或事务锁,UL 表示用户锁。 * LMODE:会话保持的锁的模式。 * ID1、ID2:ID1 表示被锁定的表的 OBJECT_ID,可以和 DBA_OBJECTS 视图关联取得具体表信息,...

    oracle锁机制

    DML锁主要用于确保数据操作时的完整性,其中TM锁(表级锁)和TX锁(事务锁或行级锁)是核心部分。TM锁在事务开始时获取,对整个表施加控制,而TX锁则针对具体的行数据,确保行级别的并发控制。TM锁有多种模式,如SS...

    oracle锁机制_bzm整理1

    Oracle数据库的锁机制是其并发控制的关键组成部分,旨在确保数据的一致性和完整性,同时允许多个用户或事务并发访问数据库。以下是对Oracle锁机制的详细解释: 1. **锁的存在原因**: - 并发控制:在多用户环境下...

    相克军 ORACLE 讲座 深度剖析 锁 笔记

    - **事务锁(TX)**:行级锁最小粒度,分为共享锁和排他锁。共享锁允许并发读取,而排他锁则独占数据行,不允许其他事务修改。在Oracle中,未提交的修改不影响其他事务的SELECT读取,这是相对于SQL Server的一个...

    关于Oracle数据库中的锁机制深入研究

    在实际应用中,Oracle数据库的DML锁(数据锁)进一步细分为TM锁(表级锁)和TX锁(事务锁或行级锁)。TM锁用于保护整个表,而TX锁则更具体,锁定的是数据行。当执行DML语句时,系统首先获取TM锁,然后获取TX锁以锁定...

    Oracle的锁表与解锁—oracle培训[参考].pdf

    主要分为两种基本类型的锁:行级锁(TX,Row Lock)和表级锁(TM,Table Lock)。行级锁用于锁定单个数据行,以防止并发事务对同一行进行冲突修改。而表级锁则锁定整个表,限制其他用户对表的读写操作。 当发生锁...

    表是否被锁住

    - `TX`: 事务锁,用于控制事务间的并发。 - `TM`: DML锁,用于数据操纵语言(如INSERT, UPDATE, DELETE)操作。 - `UL`: PL/SQL用户锁,用于PL/SQL过程中的锁定。 - `DX`: 分布式事务锁,用于跨多个数据库的分布式...

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

    行级锁,如TX锁,可以细分为X锁,只允许一个事务对特定行进行独占式访问。表级锁有共享锁(RS、RX)和排他锁(S、SRX、X),共享锁允许读取,而排他锁则禁止其他事务进行任何操作。数据库级锁可以锁定整个数据库,...

    Oracle多粒度封锁机制研究

    Oracle的行级锁(TX锁)并非直接针对单行数据,而是在事务级别实施。当事务首次执行修改操作或使用SELECT...FOR UPDATE查询时,会获取一个TX锁,这个锁在整个事务期间保持,直到事务提交(COMMIT)或回滚(ROLLBACK...

Global site tag (gtag.js) - Google Analytics