(Les09 管理数据并发处理)[20180319]
程序员文章站
2022-04-19 20:33:45
目的 描述锁定机制以及Oracle如何管理数据并发处理 监视和解决锁定冲突 锁 -可防止多个会话同时更改同一数据 -是在指定语句的最低可能级别自动获取的 -不会升级 事务处理可以锁定单个数据行,多个数据行,甚至整个表。Oracle DB支持手动锁定和自动锁定。自动获取的锁总是选择尽可能低的锁定级别, ......
目的
描述锁定机制以及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会自动检测死锁并终止发生错误的语句。
上一篇: Linux安装Apache常见报错(二)
下一篇: 最讨厌跟那些装逼的人在一起玩了