欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-09-11 08:21:12
目的 描述锁定机制以及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会自动检测死锁并终止发生错误的语句。