我在开发的这个应用并发性比较高,oracle更新数据时候如何处理并发处理呢?各位大侠发表好的观点啊,在线等待!

解决方案 »

  1.   

    oracle数据更新时,会自动默认行锁定,楼主不要操心,Oracle对并行处理已经很成熟了
      

  2.   


    同意,Oracle 会自己解决这些问题,我们只需要通过SQL 命令来操作就可以了..
    ------------------------------------------------------------------------------
    Blog: http://blog.csdn.net/tianlesoftware
    网上资源: http://tianlesoftware.download.csdn.net
    相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx
    Q Q 群:62697716 
      

  3.   

    PROCEDURE USP_S_LR_DENGJIK(DENGJIBH_IN    IN LR_DENGJIK.DENGJIBH%TYPE,
                                 GERENBH_IN     IN LR_DENGJIK.GERENBH%TYPE,
                                 JUMINBH_IN     IN LR_DENGJIK.JUMINBH%TYPE,
                                 JUZHULX_IN     IN LR_DENGJIK.JUZHULX%TYPE,
                                 LIANXIR_IN     IN LR_DENGJIK.LIANXIR%TYPE,
                                 LIANXIDH_IN    IN LR_DENGJIK.LIANXIDH%TYPE,
                                 LAONIANZ_IN    IN LR_DENGJIK.LAONIANZ%TYPE,
                                 SHENGHUOSY_IN  IN LR_DENGJIK.SHENGHUOSY%TYPE,
                                 ZILINL_IN      IN LR_DENGJIK.ZILINL%TYPE,
                                 HULIQK_IN      IN LR_DENGJIK.HULIQK%TYPE,
                                 JIANGUAN_IN    IN LR_DENGJIK.JIANGUAN%TYPE,
                                 DENGJIR_IN     IN LR_DENGJIK.DENGJIR%TYPE,
                                 DENGJIRQ_IN    IN VARCHAR2 /*日期类型,需要用TO_DATE转换*/,
                                 BEIZHU_IN      IN LR_DENGJIK.BEIZHU%TYPE,
                                 TIANBIAOR_IN   IN LR_DENGJIK.TIANBIAOR%TYPE,
                                 TIANBIAORQ_IN  IN VARCHAR2 /*日期类型,需要用TO_DATE转换*/,
                                 YONGHUBH1_IN   IN LR_DENGJIK.YONGHUBH1%TYPE,
                                 FUWUJGBH_IN    IN LR_DENGJIK.FUWUJGBH%TYPE,
                                 BIANHAO_IN     IN VARCHAR2,
                                 ZHUJIANZ_OUT   OUT VARCHAR2,
                                 APPCODE_OUT    OUT NUMBER,
                                 DATABUFFER_OUT OUT VARCHAR2) IS
        V_CNT      NUMBER(1);
        V_DENGJIBH LR_DENGJIK.DENGJIBH%TYPE := DENGJIBH_IN;
      BEGIN
        APPCODE_OUT    := '0';
        DATABUFFER_OUT := '成功';
        /*判断基础表中有无记录*/
        BEGIN
          SELECT COUNT(*)
            INTO V_CNT
            FROM DUAL
           WHERE EXISTS (SELECT 1 FROM LR_DENGJIK WHERE DENGJIBH = V_DENGJIBH);
        EXCEPTION
          WHEN OTHERS THEN
            APPCODE_OUT    := '-1';
            DATABUFFER_OUT := '调用信息失败!' || TO_CHAR(SQLCODE) || ':' || SQLERRM;
            RETURN;
        END;
        IF V_CNT = 0 THEN
          BEGIN
            /*生成主键*/
            IF BIANHAO_IN IS NULL THEN
              APPCODE_OUT    := '-1';
              DATABUFFER_OUT := '编号不能为空!';
              RETURN;
            ELSE
              V_DENGJIBH   := BIANHAO_IN || PKGGONGGONGJC.USF_GETDATE;
              ZHUJIANZ_OUT := V_DENGJIBH;
            END IF; /*插入记录*/
            INSERT INTO LR_DENGJIK
              (DENGJIBH,
               GERENBH,
               JUMINBH,
               JUZHULX,
               LIANXIR,
               LIANXIDH,
               LAONIANZ,
               SHENGHUOSY,
               ZILINL,
               HULIQK,
               JIANGUAN,
               DENGJIR,
               DENGJIRQ,
               BEIZHU,
               TIANBIAOR,
               TIANBIAORQ,
               YONGHUBH1,
               FUWUJGBH)
            VALUES
              (V_DENGJIBH,
               GERENBH_IN,
               JUMINBH_IN,
               JUZHULX_IN,
               LIANXIR_IN,
               LIANXIDH_IN,
               LAONIANZ_IN,
               SHENGHUOSY_IN,
               ZILINL_IN,
               HULIQK_IN,
               JIANGUAN_IN,
               DENGJIR_IN,
               TO_DATE(DENGJIRQ_IN, 'yyyy-MM-dd hh24:mi:ss'),
               BEIZHU_IN,
               TIANBIAOR_IN,
               TO_DATE(TIANBIAORQ_IN, 'yyyy-MM-dd hh24:mi:ss'),
               YONGHUBH1_IN,
               FUWUJGBH_IN);
          EXCEPTION
            WHEN OTHERS THEN
              ROLLBACK;
              APPCODE_OUT    := '-1';
              DATABUFFER_OUT := '调用信息失败!' || TO_CHAR(SQLCODE) || ':' || SQLERRM;
              RETURN;
          END;
        ELSE
          BEGIN
            /*更新记录*/
            UPDATE LR_DENGJIK
               SET GERENBH    = GERENBH_IN,
                   JUMINBH    = JUMINBH_IN,
                   JUZHULX    = JUZHULX_IN,
                   LIANXIR    = LIANXIR_IN,
                   LIANXIDH   = LIANXIDH_IN,
                   LAONIANZ   = LAONIANZ_IN,
                   SHENGHUOSY = SHENGHUOSY_IN,
                   ZILINL     = ZILINL_IN,
                   HULIQK     = HULIQK_IN,
                   JIANGUAN   = JIANGUAN_IN,
                   DENGJIR    = DENGJIR_IN,
                   DENGJIRQ   = TO_DATE(DENGJIRQ_IN, 'yyyy-MM-dd hh24:mi:ss'),
                   BEIZHU     = BEIZHU_IN,
                   XIUGAIRQ   = TO_DATE(TIANBIAORQ_IN, 'yyyy-MM-dd hh24:mi:ss'),
                   YONGHUBH2  = YONGHUBH1_IN,
                   FUWUJGBH   = FUWUJGBH_IN
             WHERE DENGJIBH = V_DENGJIBH;
          EXCEPTION
            WHEN OTHERS THEN
              ROLLBACK;
              APPCODE_OUT    := '-1';
              DATABUFFER_OUT := '调用信息失败!' || TO_CHAR(SQLCODE) || ':' || SQLERRM;
              RETURN;
          END;
        END IF;
        COMMIT;
      END USP_S_LR_DENGJIK;
    这样会不会引起死锁啊,如果多人操作的话
      

  4.   


    不会, 对于同一张表,当一个用户在更新时,这个表就被锁住了,其他用户就无法对表进行更新操作, 直到用户更新完成,释放了锁之后,其他用户才可以进行更新。 这个就是Oracle 内部的锁机制..楼主可以看下我的blog:
    ORACLE 锁机制http://blog.csdn.net/tianlesoftware/archive/2009/10/20/4696896.aspx数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。 加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。 在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。 
    ------------------------------------------------------------------------------
    Blog: http://blog.csdn.net/tianlesoftware
    网上资源: http://tianlesoftware.download.csdn.net
    相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx
    Q Q 群:62697716 
      

  5.   

    楼主的PKGGONGGONGJC.USF_GETDATE如果取到的只是年月日时分,LR_DENGJIK表又不是DENGJIBH作为主键的话,有插入重复DENGJIBH 的危险。
      

  6.   

    楼主有点多虑了,强大的ORACLE有内锁机制,不用我们去处理了。
      

  7.   

    楼上打红星的也不咋样嘛,分情况不同,会锁,我还在找资料。有一种情况会产生 并发锁失效。取出你要的一行数据准备处理,取出以后,进行复杂处理,可能100-1000毫秒左右,再去更新
    这时就产生锁失效,所以,必须手动处理并发问题。例如,A 账户有 200元,我在表上加一个字段,ISLocked=0 没锁,ISLocked=1加了锁 ,我首先把字段加锁,然后查询,然后取出现金余额值到应用程序,然后修改数据。表面上,没问题,如果是高并发,100个同时查询,可能就会出现,查询的时候都没锁,然后依次去加锁(更新ISLocked=1)
    同时去更新表的 200元解决这个问题应该是 更新的时候这么更新,update 表 set ISlocked=1 where ISLocked=0
    这样仿佛可以避免最直接的办法是 加行锁,但是这样对于应用程序,会产生严重错误
      

  8.   

    另外,我也想到,用事务去处理,但是这又是并发事务,我开始用MS SQL,直接报错,发生锁死ORacle没出错,但是还是有问题事务按道理是 原子性的,加了锁不应该给别的事务再加锁,事实相反
    不要太相信 数据库,不要太相信权威,自己动手看看小规模并发,大规模并发,完全是2回事,你自己用几十行数据模拟一下就得到的结论,太片面
    往往要接触到才体会到
      

  9.   


    你懂什么?利用字段加锁,又不是oracle默认的加锁!你这个加了个字段的,任何数据库都行!手工加锁出问题能怪数据库???自己把锁的概念搞错了,还怪人家有星的说的不对????我没星,只是就事论事。