日期:2014-05-16  浏览次数:20519 次

Oracle DB 管理数据并发处理
? 描述锁定机制以及Oracle 如何管理数据并发处理
? 监视和解决锁定冲突

? 可防止多个会话同时更改同一数据
? 是在指定语句的最低可能级别自动获取的
? 不会升级



会话必须先锁定要修改的数据,之后数据库才允许会话修改相应数据。锁定后,会话拥有对数据的独占控制权,这样在释放锁之前,其它任何事务处理都不能修改锁定的数据。
事务处理可以锁定单个数据行、多个数据行、甚至整个表。Oracle DB 支持手动锁定和自动锁定。自动获取的锁总是选择尽可能低的锁定级别,以尽量减少与其它事务处理的潜在冲突。
注:Oracle  实例使用许多类型的锁来保持内部一致性。


  • 锁定机制
? 高级数据并发处理:
 执行插入、更新和删除时使用行级锁
– 查询不需要任何锁
? 自动队列管理
? 在事务处理结束(使用COMMIT 或ROLLBACK 操作)之前会一直保持锁定

锁定机制用于在数据库中提供尽可能高的数据并发处理能力。事务处理修改数据时会获取行级锁,而不是块级或表级锁。修改对象(如表移动)时会获取对象级锁,而不是整个数据库锁或方案锁。
数据查询不需要锁,即使有人锁定了数据,查询也能成功进行(总是显示原始的、根据还原信息重新构造的锁定之前的值)。
如果多个事务处理需要锁定同一资源,则第一个请求锁的事务处理会获得锁。其它事务处理将等待,直到第一个事务处理完成为止。排队机制是自动进行的,不需要管理员干预。
事务处理完成(即发出COMMIT 或ROLLBACK )时,将释放所有锁。如果事务处理失败,同一后台进程会自动回退失败的事务处理所进行的所有更改,然后释放失败事务处理持有的所有锁。

  • 数据并发处理

默认情况下,锁定机制采用细粒度行级锁定模式。不同的事务处理可更新同一表内不同的行,彼此互不干扰。
尽管默认模式是行级锁定,但Oracle DB 也允许根据需要在更高级别执行手动锁定:
SQL> LOCK TABLE employees IN EXCLUSIVE MODE; 
Table(s) Locked.
使用以上语句时,其他任何尝试更新锁定表中行的事务处理都必须等待,直到发出锁定请求的事务处理完成为止。EXCLUSIVE 是最严格的锁模式。下面列出了其它一些锁模式:
? ROW SHARE:允许对锁定的表进行并发访问,但禁止在会话中锁定整个表进行独占访问。
? ROW EXCLUSIVE :与ROW SHARE 相同,但是同时禁止以SHARE模式锁定。更新、插入或删除数据时会自动获取ROW EXCLUSIVE 锁。ROW EXCLUSIVE 锁允许多个进程执行读取,但只允许一个进程执行写入。
? SHARE:允许并发查询,但禁止更新锁定的表。需要有SHARE锁才能创建表的索引,创建时会自动请求该锁。但是,创建联机索引的操作在建立索引时需要有ROW SHARE锁。
共享锁允许多个进程进行读取,但不允许执行写入。删除或更新某个父表中的行,并且其子表在该父表上具有外键约束条件时,也会以透明方式使用共享锁。

? SHARE ROW EXCLUSIVE:用于查询整个表,允许其他人查询表中的行,但禁止其他人在SHARE模式下锁定表或更新行。
? EXCLUSIVE:允许查询锁定表,禁止对锁定表执行任何其它活动。需要有EXCLUSIVE 锁才能删除表。
与任何锁定请求一样,手动锁定语句会一直等待,直到已经持有锁(或先前请求锁定)的所有会话释放锁为止。LOCK 命令可接受用于控制等待行为的特殊参数NOWAIT 。NOWAIT 会立即