隨筆-314  評論-209  文章-0  trackbacks-0
          oracle table-lock的5種模式

          Oracle中的鎖定可以分為幾類:
          1、DML lock(data lock),
          2、DDL lock(dictionary lock)
          3、internal lock/latch。

          DML lock又可以分為row lock和table lock。row lock在select.. for update/insert/update/delete時隱式自動產(chǎn)生,而table lock除了隱式產(chǎn)生,也可以調(diào)用lock table <table_name> in </table_name> name來顯示鎖定。

          如果不希望別的session lock/insert/update/delete表中任意一行,只允許查詢,可以用lock table table_name in exclusive mode。(X)這個鎖定模式級別最高,并發(fā)度最小。

          如果允許別的session查詢或用select for update鎖定記錄,不允許insert/update/delete,可以用
          lock table table_name in share row exclusive mode。(SRX)

          如果允許別的session查詢或select for update以及l(fā)ock table table_name in share mode,只是不允許insert/update/delete,可以用
          lock table table_name in share mode。(share mode和share row exclusive mode的區(qū)別在于一個是非搶占式的而另一個是搶占式的。進入share row exclusive mode后其他session不能阻止你insert/update/delete,而進入share mode后其他session也同樣可以進入share mode,進而阻止你對表的修改。(S)

          還有兩種鎖定模式,row share(RS)和row exclusive(RX)。他們允許的并發(fā)操作更多,一般直接用DML語句自動獲得,而不用lock語句。
          詳細參考concepts文檔中的"Type Of Locks":
          http://download-uk.oracle.com/docs/cd/B10501_01/server.920/a96524/c21cnsis.htm#2937


          -------------------------------------
          怎么unlock table 解鎖

          方法一、kill session:

          SQL> select object_id,session_id from v$locked_object;  //注意session_id 就是上鎖的 session標(biāo)志
          SQL> select username,sid,SERIAL#  from v$session where sid=。。;      //這里的SID = session_id
          SQL> alter system kill session 'id,serial#';     //殺死該session

          方法二、rollback/commit 終止事務(wù)處理
          posted on 2010-04-02 16:05 xzc 閱讀(7238) 評論(1)  編輯  收藏 所屬分類: Oracle

          評論:
          # re: oracle table-lock的5種模式 2010-04-02 16:05 | xzc
          FUNCTION func_cre_load_partition(v_table_name varchar2,
          v_acct_month varchar2,
          v_partitionName varchar2,
          v_lan_id number) RETURN NUMBER IS
          /***************************************************************
          函數(shù)名:(func_cre_partition)
          功能描述:建立分區(qū)策略
          輸入?yún)?shù)說明:v_table_name 需要建分區(qū)的表名
          v_acct_month 建分區(qū)的月份
          v_partitionName 分區(qū)名稱
          v_lan_id 建分區(qū)的本地網(wǎng)
          返回參數(shù)說明: 1 成功 -1 失敗
          創(chuàng)建人員:lizhenpeng
          創(chuàng)建日期:2009-4-14
          ***************************************************************/
          exists_flag int;
          v_sql varchar2(2000);
          i_status int := 0;
          V_LOGID NUMBER(12);
          v_err VARCHAR2(500);
          begin
          --判斷分區(qū)是否存在
          select count(*)
          into exists_flag
          from USER_TAB_PARTITIONS
          where table_name = UPPER(v_table_name)
          and partition_name = UPPER(v_partitionName || '_' || v_acct_month || '_' ||
          to_char(v_lan_id));
          --不存在創(chuàng)建對應(yīng)分區(qū)
          if exists_flag = 0 then
          loop
          v_sql := 'LOCK TABLE OTH_PARTITION_CTL IN EXCLUSIVE MODE';
          execute immediate v_sql;
          --判斷是否鎖定 0未開始 2 進行 1 完成
          begin
          select status
          into i_status
          from oth_partition_ctl
          where fwf_no = v_acct_month
          and table_name = UPPER(v_table_name);

          exception
          when others then
          insert into oth_partition_ctl
          values
          (v_acct_month, UPPER(v_table_name), 2);
          commit;
          i_status := 0;
          end;
          commit;
          --創(chuàng)建分區(qū)考慮是否重復(fù)創(chuàng)建邏輯
          if i_status = 0 then
          update oth_partition_ctl
          set status = 2
          where fwf_no = v_acct_month
          and table_name = UPPER(v_table_name);
          commit;
          for v1 in (select standard_code
          from oth_code_relation
          where system_id = 2
          and code_type = 'LAN_ID'
          and standard_code like '7%'
          ORDER BY STANDARD_CODE) loop
          v_sql := 'alter table ' || v_table_name || ' add PARTITION ' ||
          v_partitionName || '_' || v_acct_month || '_' ||
          v1.standard_code || ' values less than (' ||
          v_acct_month || ',' ||
          to_char(to_number(v1.standard_code) + 1) ||
          ') NOLOGGING';
          execute immediate v_sql;
          end loop;
          --修改完成標(biāo)志
          update oth_partition_ctl
          set status = 1
          where fwf_no = v_acct_month
          and table_name = UPPER(v_table_name);
          commit;

          elsif (i_status = 2) then
          --別的進程正在建立分區(qū),等待完成
          dbms_lock.sleep(30);
          elsif (i_status = 1) then
          --已經(jīng)等待別的進程分區(qū)創(chuàng)建完成
          goto lab_exit;
          end if;
          end loop;
          <<lab_exit>>
          null;
          --存在TRUNCATE對應(yīng)分區(qū)
          elsif (exists_flag > 0) then
          dbms_lock.sleep(to_number(v_lan_id) - 700);
          v_sql := 'alter table ' || v_table_name || ' truncate PARTITION ' ||
          v_partitionName || '_' || v_acct_month || '_' ||
          to_char(v_lan_id);
          execute immediate v_sql;
          end if;
          return 1;
          exception
          when others then
          update oth_partition_ctl
          set status = 0
          where fwf_no = v_acct_month
          and table_name = UPPER(v_table_name);
          commit;
          v_err := substr(sqlerrm, 1, 254);
          select seq_job_id.nextval into V_LOGID from dual;
          INSERT INTO oth_fat_detail_log
          (LOG_ID,
          LAN_CODE,
          ACCT_MONTH,
          PROC_NAME,
          ERR_CODE,
          ERR_NAME,
          ERR_MSG,
          start_time)
          VALUES
          (V_LOGID,
          v_lan_id,
          v_acct_month,
          V_TABLE_NAME,
          v_partitionName || '_' || v_acct_month || '_' || v_lan_id,
          v_partitionName || '_' || v_acct_month || '_' || v_lan_id,
          v_err,
          sysdate);
          return - 1;
          end func_cre_load_partition;  回復(fù)  更多評論
            
          主站蜘蛛池模板: 阿瓦提县| 龙山县| 日照市| 玉环县| 汝州市| 阳春市| 固阳县| 禄劝| 清流县| 宁蒗| 峨边| 湖州市| 呼伦贝尔市| 乐昌市| 西昌市| 浮梁县| 滕州市| 简阳市| 谢通门县| 芦溪县| 灌云县| 屏东县| 黄龙县| 吉首市| 汝南县| 额济纳旗| 襄樊市| 永修县| 五华县| 藁城市| 囊谦县| 玉田县| 博罗县| 泸州市| 临夏县| 苗栗县| 克拉玛依市| 宜章县| 湖口县| 木兰县| 舟山市|