隨筆-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時隱式自動產生,而table lock除了隱式產生,也可以調用lock table <table_name> in </table_name> name來顯示鎖定。

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

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

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

          還有兩種鎖定模式,row share(RS)和row exclusive(RX)。他們允許的并發操作更多,一般直接用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標志
          SQL> select username,sid,SERIAL#  from v$session where sid=。。;      //這里的SID = session_id
          SQL> alter system kill session 'id,serial#';     //殺死該session

          方法二、rollback/commit 終止事務處理
          posted on 2010-04-02 16:05 xzc 閱讀(7242) 評論(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
          /***************************************************************
          函數名:(func_cre_partition)
          功能描述:建立分區策略
          輸入參數說明:v_table_name 需要建分區的表名
          v_acct_month 建分區的月份
          v_partitionName 分區名稱
          v_lan_id 建分區的本地網
          返回參數說明: 1 成功 -1 失敗
          創建人員:lizhenpeng
          創建日期:2009-4-14
          ***************************************************************/
          exists_flag int;
          v_sql varchar2(2000);
          i_status int := 0;
          V_LOGID NUMBER(12);
          v_err VARCHAR2(500);
          begin
          --判斷分區是否存在
          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));
          --不存在創建對應分區
          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;
          --創建分區考慮是否重復創建邏輯
          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;
          --修改完成標志
          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
          --別的進程正在建立分區,等待完成
          dbms_lock.sleep(30);
          elsif (i_status = 1) then
          --已經等待別的進程分區創建完成
          goto lab_exit;
          end if;
          end loop;
          <<lab_exit>>
          null;
          --存在TRUNCATE對應分區
          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;  回復  更多評論
            
          主站蜘蛛池模板: 江北区| 金溪县| 莱西市| 浮山县| 龙南县| 虹口区| 柳州市| 南漳县| 扶风县| 司法| 香河县| 黄骅市| 双城市| 交城县| 翼城县| 静乐县| 油尖旺区| 额尔古纳市| 遂平县| 龙海市| 固镇县| 西吉县| 江油市| 虎林市| 泽普县| 广汉市| 张家港市| 乌拉特中旗| 文水县| 班戈县| 洪洞县| 高要市| 浪卡子县| 威海市| 淳化县| 元氏县| 阿巴嘎旗| 分宜县| 马鞍山市| 八宿县| 曲靖市|