<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;  回復  更多評論
      
    主站蜘蛛池模板: 亚洲丁香色婷婷综合欲色啪| 伊人久久亚洲综合影院| 亚洲日韩在线中文字幕第一页| 亚洲乱码在线卡一卡二卡新区| 日本黄网站动漫视频免费| 日本免费在线观看| 久久亚洲国产精品一区二区| eeuss影院ss奇兵免费com| 亚洲精品无码专区2| 免费无遮挡无码视频在线观看| 又粗又大又硬又爽的免费视频| 亚洲成人午夜在线| 亚在线观看免费视频入口| 亚洲电影一区二区| 永久看日本大片免费35分钟| 亚洲美女大bbbbbbbbb| 亚洲精品在线免费观看| 亚洲中文字幕无码一去台湾| 美女视频黄的免费视频网页| 亚洲国产精品热久久| 久久国产免费福利永久| 亚洲中文字幕日本无线码| 免费a级黄色毛片| 久久久免费观成人影院| 久久伊人久久亚洲综合| 很黄很黄的网站免费的| 亚洲国产精品福利片在线观看| 午夜免费福利视频| ww亚洲ww在线观看国产| 四虎成人免费网站在线| 人碰人碰人成人免费视频| 国产亚洲免费的视频看| 噼里啪啦免费观看高清动漫4| 亚洲暴爽av人人爽日日碰| 亚洲一级特黄大片无码毛片| 久久青青草原国产精品免费| 亚洲专区一路线二| 亚洲国产综合无码一区二区二三区| 伊人久久大香线蕉免费视频| 亚洲最大在线观看| 亚洲精品在线视频|