目的 描述锁定机制以及Oracle如何管理数据并发处理 监视和解决锁定冲突 锁 -可防止多个会话同时更改同一数据 -是在指定语句的最低可能级别自动获取的 -不会升级 事务处理可以锁定单个数据行,多个数据行,甚至整个表。Oracle DB支持手动锁定和自动锁定。自动获取的锁总是选择尽可能低的锁定级别,以尽量减少与其它事务处理的潜在冲突。 锁定机制 高级数据并发处理 -执行插入,更新和删除时使用行级锁 -查询不要要任何锁 自动队列管理 在事务处理结束(使用COMMIT或ROLLBACK操作)之前会一直保持锁定 注意:事务处理修改数据时会获取行级锁,而不是块级或表级锁。修改对象(如表移动)时会获取对象锁,而不是整个数据库锁或schema锁。 SQL> LOCK TABLE employees IN EXCLUSIVE MODE; 锁模式 ROW SHARE:允许对锁定的表进行并发访问,但禁止在会话中锁定整个表进行独占访问。 ROW EXCLUSIVE:与ROW SHARE相同,但是同时禁止以SHARE模式锁定。更新,插入或删除数据时会自动获取ROW EXCLUSIVE锁。ROW EXCLUSIVE锁允许多个进行执行读取,但只允许一个进程执行写入。 SHARE:允许并发查询,但禁止更新锁定的表。需要具有SHARE锁才能创建表的索引,创建时会自动请求该锁。但是,创建联机索引的操作在建立索引时需要具有ROW SHARE锁。共享锁允许多个进程进行读取,但不允许执行写入。删除或更新某个父表中的行,并且其子表在该父表上具有外键约束条件时,也会以透明方式使用共享锁。 SHARE ROW EXCLUSIVE:用于查询整个表,允许其他人查询表中的行,但禁止其他人在SHARE模式下锁定表或更新行。 EXCLUSIVE:允许查询锁定表,禁止对锁定表执行任何其他活动。需要具有EXCLUSIVE锁才能删除表。 DML锁 每个DML事务处理必须获取两个锁: 针对正在更新的一行或多行的EXCLUSIVE行锁 针对正在更新的表的ROW EXCLUSIVE(RX)模式下的表所(TM),这个可避免在进行更改时另一会话锁定整个表(可能会删除或截断表)。这种模式也称为子排它表锁(SX)。 入队机制 锁定请求自动排队。只要持有某个锁的事务处理一完成,队列中的下一个会话就接收该锁。入队机制会跟踪请求锁的顺序及请求的锁模式。已经持有锁的会话可请求转换锁,而不必排到队尾。 等待入队的进程分为两类:没有共享所有权的等待进程,以及有共享所有权/但没有选择升级锁级别的等待进程。第二类等待进程称为转换进程,这类进程的优先级始终高于正常等待进程,即使其等待时间较短。 入队机制用于跟踪 -等待锁的会话 -请求的锁模式 -会话请求锁的顺序 锁冲突 锁冲突的可能原因 -未提交更改 -长时间运行事务处理:同时执行事务和批量时通常会发生锁冲突。 -不必要的高锁定级别 检测锁冲突 -提交或回退持有锁的会话 -终止持有锁的会话(在紧急情况下) 注:如果会话出现空闲超时,PMON会话检测程序会自动终止会话,这可以使用概要文件或资源管理器来完成。 使用SQL解决锁冲突 SELECT SID,SERIAL#,USERNAME FROM V$SESSION WHERE SID IN (SELECT BLOCKING_SESSION FROM V$SESSION); ALTER SYSTEM KILL SESSION ‘<SID>,<SERIAL#>’ IMMEIDATE; ALTER SYSTEM DISCONNECT SESSION ‘<SID>,<SERIAL#>’ IMMEDIATE; 死锁 死锁是锁冲突的一种特殊情况。两个或更多会话等待已被其中另一个会话锁定的数据时,就会发生死锁。因为每个会话都在等待另一个会话释放锁,所以任何一个会话都不能完成事务处理,也就不能解决冲突。Oracle DB会自动检测死锁并终止发生错误的语句。
自动重建索引
上一篇
2022年3月22日
Oracle之表空间
下一篇
2022年3月22日