网站开发常用工具,网站建设好还需要续费吗,免费开源企业网站程序,同仁seo排名优化培训Oracle数据库中的锁机制
数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时#xff0c;在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据#xff0c;破坏数据库的一致性。
在数据库中有两种基本的锁类…Oracle数据库中的锁机制
数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据破坏数据库的一致性。
在数据库中有两种基本的锁类型排它锁Exclusive Locks即X锁和共享锁Share Locks即S锁。当数据对象被加上排它锁时其他的事务不能对它读取和修改加了共享锁的数据对象可以被其他事务读取但不能修改。
根据保护对象的不同Oracle数据库锁可以分为以下几大类
(1) DML lockdata locks数据锁用于保护数据的完整性
(2) DDL lockdictionary locks字典锁用于保护数据库对象的结构例如表、视图、索引的结构定义
(3) Internal locks 和latches内部锁与闩保护内部数据库结构
(4) Distributed locks分布式锁用于OPS并行服务器中
(5) PCM locks并行高速缓存管理锁用于OPS并行服务器中。
在Oracle中最主要的锁是DML也可称为data locks数据锁锁。DML锁的目的在于保证并发情况下的数据完整性。在Oracle数据库中DML锁主要包括TM锁和TX锁其中TM锁称为表级锁TX锁称为事务锁或行级锁。
意向锁的含义是如果对一个结点加意向锁则说明该结点的下层结点正在被加锁对任一结点加锁时必须先对它的上层结点加意向锁。如对表中的任一行加锁时必须先对它所在的表加意向锁然后再对该行加锁。这样一来事务对表加锁时就不再需要检查表中每行记录的锁标志位了系统效率得以大大提高。
TM锁表级锁类型共有5种分别称为共享锁S锁、排它锁X锁、行级共享锁RS锁、行级排它锁RX锁、共享行级排它锁SRX锁
当Oracle执行DML语句时系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后系统再自动申请TX类型的锁并将实际锁定的数据行的锁标志位进行置位。这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志而只需检查TM锁模式的相容性即可大大提高了系统的效率。TM锁包括了SS、SX、S、X等多种模式在数据库中用06来表示。不同的SQL操作产生不同类型的TM锁。如表1所示。 1. 共享锁Share Table LockS
加锁语法Lock Table TableName In Share Mode;
允许的操作一个共享锁由一个事务控制仅允许其它事务查询被锁定的表。一个有效的共享锁明确地用Select … For update形式锁定行或执行Lock Table TableName In Share Mode语法锁定整个表不允许被其它事务更新。
禁止的操作一个共享锁由一个事务来控制防止其它事务更新该表或执行下面的语句
LOCK TABLE TableName IN SHARE ROW EXCLUSIVE MODE;
LOCK TABLE TableName IN ROW EXCLUSIVE MODE;
2. 排它锁Exclusive Table LockX
排它锁是在锁机制中限制最多的一种锁类型允许加排它锁的事务独自控制对表的写权限。
加锁语法Lock Table TableName In Exclusive Mode;
允许的操作在一个表中只能有一个事务对该表实行排它锁排它锁仅允许其它的事务查询该表。
禁止的操作拥有排外锁的事务禁止其它事务执行其它任何DML类型的语句或在该表上加任何其它类型的锁。
定义排它锁的语法
LOCK TABLE TableName IN EXCLUSIVE MODE;
3. 行级锁Row Share Table LockRS
一个行级锁有时称为Subshare Table Lock简称SS子共享锁需要该事务在被锁定行的表上用update的形式加锁。当有下面语句被执行的时候行级锁自动加在操作的表上。
SELECT . . . FROM TableName. . . FOR UPDATE OF . . . ;
LOCK TABLE TableName IN ROW SHARE MODE;
行级锁Row Share Table Lock在锁类型中是限制最少的也是在表的并发程度中使用程度最高的。
允许的操作行级共享锁由一个事务控制允许其它事务查询、插入、更新、删除或同时在同一张表上锁定行。因此其它事务可以同时在同一张表上得到行级锁、共享行级排它锁、行级排它锁、排它锁。
禁止的操作拥有行级锁的事务不允许其它事务执行排它锁即
Lock Table TableName In Exclusive Mode;
4. 行级排它锁Row Exclusive Table LockRX
行级排它锁亦称为Subexclusive Table Lock简称SX子排它锁通常需要事务拥有的锁在表上被更新一行或多行。当有下面语句被执行的时候行级排它锁被加在操作的表上。
INSERT INTO TableName. . . ;
UPDATE TableName. . . ;
DELETE FROM TableName. . . ;
LOCK TABLE TableName IN ROW EXCLUSIVE MODE;
行级排它锁比行级锁稍微多一些限制。
允许的操作行级排它锁由一个事务拥有允许其它事务执行查询、修改、插入、删除或同时在同一张表上锁定行。执有行级排它锁的事务允许其它事务在同一张表上同时得到共享锁和行级排它锁。
禁止的操作行级排它锁由一个事务拥有防止其它事务手动锁定表来排除其它事务的读写权。因此其它事务不允许在同一张表上使用以下的语句来执行锁事务。
LOCK TABLE table IN SHARE MODE;
LOCK TABLE table IN SHARE EXCLUSIVE MODE;
LOCK TABLE table IN EXCLUSIVE MODE
5. 共享行级排它锁Share Row Exclusive Table LockSRX
共享行级排它锁有时也称共享子排它锁Share Subexclusive Table LockSSX它比共享锁有更多限制。定义共享行级排它锁的语法为
Lock Table TableName In Share Row Exclusive Mode;
允许的操作仅允许一个事务在某一时刻得到行级排它锁。拥有行级排它锁事务允许其它事务在被锁定的表上执行查询或使用Select … From TableName For update…来准确在锁定行而不能更新行。
禁止的操作拥有行级排它锁的事务不允许其它事务有除共享锁外的其它形式的锁加在同一张表上或更新该表。即下面的语句是不被允许的
LOCK TABLE TableName IN SHARE MODE;
LOCK TABLE TableName IN SHARE ROW EXCLUSIVE MODE;
LOCK TABLE TableName IN ROW EXCLUSIVE MODE;
LOCK TABLE TableName IN EXCLUSIVE MODE;
当Oracle数据库发生TX锁等待时如果不及时处理常常会引起Oracle数据库挂起或导致死锁的发生产生ORA-60的错误。
TX锁等待的分析
Oracle数据库中一般使用行级锁。
当Oracle检测到死锁产生时中断并回滚死锁相关语句的执行报ORA-00060的错误并记录在数据库的日志文件alertSID.log中。同时在user_dump_dest下产生了一个跟踪文件详细描述死锁的相关信息。
在日常工作中如果发现在日志文件中记录了ora-00060的错误信息则表明产生了死锁。这时需要找到对应的跟踪文件根据跟踪文件的信息定位产生的原因。 解锁及Kill Session:
使用下面的语法查出锁并杀掉Session。
SELECT A.SID,A.SERIAL#,A.USERNAME,B.TYPE FROM V$SESSION A,V$LOCK B WHERE A.SIDB.SID;ALTER SYSTEM KILL SESSION SID,SERIAL#;