当前位置: 移动技术网 > IT编程>数据库>Oracle > (Les09 管理数据并发处理)[20180319]

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

2018年03月23日  | 移动技术网IT编程  | 我要评论

几内亚比绍移民,安倍搅局南海拉法国入伙:人家不去,喜爱夜蒲ed2k

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网