<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 閱讀(7237) 評論(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;  回復  更多評論
      
    主站蜘蛛池模板: 毛片视频免费观看| 麻花传媒剧在线mv免费观看| 国产精品二区三区免费播放心| 亚洲伊人久久大香线蕉在观| 国产精品区免费视频| 亚洲av中文无码乱人伦在线播放 | 久久国产精品免费网站| 国产亚洲成人在线播放va| 一个人免费观看视频在线中文| 亚洲av无码乱码在线观看野外| 免费看一级毛片在线观看精品视频| 亚洲国模精品一区| a毛片免费在线观看| 久久亚洲精品成人综合| 久久九九兔免费精品6| 亚洲AV色吊丝无码| 国产三级免费电影| a毛片成人免费全部播放| 亚洲成AV人片在线观看无| 一级毛片**不卡免费播| 亚洲不卡1卡2卡三卡2021麻豆| 日韩高清在线高清免费| 丰满妇女做a级毛片免费观看| 亚洲精品乱码久久久久久按摩| 午夜无码A级毛片免费视频| 亚洲国产精品久久久久秋霞影院 | 亚洲一区免费在线观看| 亚洲最大中文字幕无码网站| 国产hs免费高清在线观看| 精品乱子伦一区二区三区高清免费播放| 亚洲国产精品VA在线看黑人| 可以免费看黄视频的网站| 特级毛片A级毛片100免费播放| 久久亚洲AV午夜福利精品一区 | 国产zzjjzzjj视频全免费| A毛片毛片看免费| 亚洲无限乱码一二三四区| 亚洲成av人片天堂网老年人| 毛片在线播放免费观看| 亚洲人成色4444在线观看| 亚洲色无码专区在线观看|