zoukankan      html  css  js  c++  java
  • Oracle 6

    Oracle锁没有额外的开销?Oracle的锁是怎么实现的?因为其他数据库,锁都是一种稀有资源和开销。

    答:代码级实现??

    没有锁的话,并发更新就会有丢失更新的问题。

    悲观锁和乐观锁

    悲观锁一般用于有状态,有连接的环境下,通常是客户/服务器系统。在更新会话中使用SELECT FOR UPDATE 锁定要更新的那一行。

    乐观锁,只有在要更新的时候,才去锁定行。

    为了防止出现丢失更新,乐观锁一般采用如下方法。

    1.在DML中带上旧值, 比如

    UPDATE EMP

    SET SALARY = :sal

    WHERE empno= :no AND salary= :old_sal

     这样的话,如果其他用户已经修改了这一行,那么这个UPDATE就不会修改任何行。

    2.增加一个版本列,一般是NUMBER类型或DATETIME 时间戳类型

    方法与#1一样,UPDATE的时候在WHERE子句中加上 这个时间戳列

    3.校验和
    对要更新的这一行,计算一个hash值,ORA_HASH

    何时适用悲观锁和乐观锁

    (1) 客户/服务器模式适用悲观锁定, 用户不多。

    (2) 遗留系统,既有客户/服务器系统(已经使用了悲观锁),又有web访问的系统,那么web系统要适用乐观锁,适用ORA_HASH的方法, 因为我们不希望修改数据库,增加一列,这样遗留系统也要修改。

    (3) 其他系统都使用乐观锁。

    怎么避免阻塞和死锁

    会产生阻塞的语句只有:SELECT FOR UPDATE, INSERT, DELET, UPDATE, MERGE

    (1)    用SELECT FOR UPDATE NO WAIT

    (2)    INSERT 很少会产生死锁,除了用户自己生成主键的情况,有重复主键同时要插入数据库

    (3)    UPDATE/DELETE/MERGE 可以通过先执行一下 SELECT FOR UPDATE NOWAIT避免。

  • 相关阅读:
    BZOJ1036 [ZJOI2008]树的统计Count 树链剖分
    SPOJ-QTREE Query on a tree 树链剖分
    BZOJ3224 洛谷3369 Tyvj 1728 普通平衡树 splay
    BZOJ1008 [HNOI2008]越狱 快速幂
    HDU4686 Arc of Dream 矩阵
    POJ2065 SETI 高斯消元
    POJ1487 Single-Player Games 高斯消元
    HDU3306 Another kind of Fibonacci 矩阵
    Hadoop基本操作
    Hadoop命令大全
  • 原文地址:https://www.cnblogs.com/xzpp/p/3438217.html
Copyright © 2011-2022 走看看