(Les09 管理数据并发处理)[20180319]

目的     描述锁定机制以及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会自动检测死锁并终止发生错误的语句。

(0)
上一篇 2022年3月22日
下一篇 2022年3月22日

相关推荐