隨筆-314  評(píng)論-209  文章-0  trackbacks-0
          oracle table-lock的5種模式

          Oracle中的鎖定可以分為幾類(lèi):
          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時(shí)隱式自動(dòng)產(chǎn)生,而table lock除了隱式產(chǎn)生,也可以調(diào)用lock table <table_name> in </table_name> name來(lái)顯示鎖定。

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

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

          如果允許別的session查詢(xún)或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ū)別在于一個(gè)是非搶占式的而另一個(gè)是搶占式的。進(jìn)入share row exclusive mode后其他session不能阻止你insert/update/delete,而進(jìn)入share mode后其他session也同樣可以進(jìn)入share mode,進(jìn)而阻止你對(duì)表的修改。(S)

          還有兩種鎖定模式,row share(RS)和row exclusive(RX)。他們?cè)试S的并發(fā)操作更多,一般直接用DML語(yǔ)句自動(dòng)獲得,而不用lock語(yǔ)句。
          詳細(xì)參考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 閱讀(7240) 評(píng)論(1)  編輯  收藏 所屬分類(lèi): Oracle

          評(píng)論:
          # 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ù)說(shuō)明:v_table_name 需要建分區(qū)的表名
          v_acct_month 建分區(qū)的月份
          v_partitionName 分區(qū)名稱(chēng)
          v_lan_id 建分區(qū)的本地網(wǎng)
          返回參數(shù)說(shuō)明: 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)建對(duì)應(yīng)分區(qū)
          if exists_flag = 0 then
          loop
          v_sql := 'LOCK TABLE OTH_PARTITION_CTL IN EXCLUSIVE MODE';
          execute immediate v_sql;
          --判斷是否鎖定 0未開(kāi)始 2 進(jìn)行 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
          --別的進(jìn)程正在建立分區(qū),等待完成
          dbms_lock.sleep(30);
          elsif (i_status = 1) then
          --已經(jīng)等待別的進(jìn)程分區(qū)創(chuàng)建完成
          goto lab_exit;
          end if;
          end loop;
          <<lab_exit>>
          null;
          --存在TRUNCATE對(duì)應(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ù)  更多評(píng)論
            
          <2010年4月>
          28293031123
          45678910
          11121314151617
          18192021222324
          2526272829301
          2345678

          常用鏈接

          留言簿(12)

          隨筆分類(lèi)

          隨筆檔案

          收藏夾

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 开鲁县| 潮州市| 大港区| 庆城县| 高陵县| 随州市| 石家庄市| 丰县| 甘泉县| 新余市| 万源市| 苏州市| 闽清县| 雷山县| 皋兰县| 鄂托克前旗| 龙门县| 明星| 达日县| 青铜峡市| 酉阳| 兴海县| 西昌市| 石城县| 鄂托克旗| 镶黄旗| 壶关县| 望都县| 册亨县| 平度市| 遵化市| 大足县| 明水县| 昌宁县| 阜宁县| 共和县| 徐水县| 新巴尔虎左旗| 关岭| 阿拉善右旗| 竹北市|