<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-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 閱讀(7236) 評論(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;  回復  更多評論
      
    主站蜘蛛池模板: 亚洲综合免费视频| 亚洲人和日本人jizz| 久久综合日韩亚洲精品色| 色屁屁www影院免费观看视频| 毛片a级毛片免费观看免下载| 亚洲一区精彩视频| 无码永久免费AV网站| 亚洲香蕉网久久综合影视| 亚洲午夜久久久久久尤物| sihu国产精品永久免费| 亚洲国产人成中文幕一级二级| 日本永久免费a∨在线视频| 亚洲区日韩区无码区| 亚洲最大的黄色网| 精品无码国产污污污免费| 亚洲国产人成网站在线电影动漫| 精品国产一区二区三区免费| 亚洲黄色免费网站| 国外成人免费高清激情视频| 精品女同一区二区三区免费播放 | 成年在线观看网站免费| 亚洲精品欧美综合四区| 免费a级毛片无码av| 亚洲一级毛片免观看| 午夜高清免费在线观看| 无遮挡免费一区二区三区| 午夜免费不卡毛片完整版| 精品亚洲aⅴ在线观看| 西西大胆无码视频免费| 亚洲人成影院在线| 成全视频免费高清| 亚洲av无码久久忘忧草| 5555在线播放免费播放| 欧洲亚洲国产精华液| 亚洲熟妇无码乱子AV电影| 青青青国产在线观看免费网站| 国产成人不卡亚洲精品91| 久久亚洲中文字幕精品有坂深雪| 日韩视频免费一区二区三区| a毛片免费全部在线播放**| 国产亚洲精品拍拍拍拍拍|