1.準備測試表及數據
create table TEST_SER
(
tid NUMBER,
tname VARCHAR2(10)
);
2.插入測試數據
insert into test_ser(tid,tname)
select rownum tid,'n_' || rownum tname from dual connect by level<=1000;
commit;
3.查看數據分布
select min(tid) as min_tid,max(tid) as max_tid,
dbms_rowid.rowid_object(rowid) as "object_id(數據對象號)",
dbms_rowid.rowid_relative_fno(rowid) as "file_id(相對文件號)",
dbms_rowid.rowid_block_number(rowid) as "block_id(在第幾個塊)"
--,dbms_rowid.rowid_row_number(rowid) as "num(在block中的行數)"
from test_ser
group by dbms_rowid.rowid_object(rowid),dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid);
MIN_TID MAX_TID object_id(對象號) file_id(文件號) block_id(在第幾個塊)
985 1000 73197 18 182
500 984 73197 18 181
1 499 73197 18 180
4.測試會話1
# T1 時間 設置事務級別 SERIALIZABLE
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
# T2 時間
select tid,tname from test_ser where tid in(1,500);
TID TNAME
1 1 n_1
2 500 n_500
5.測試會話2
#T3 時間(可選項,因為默認是 READ COMMITTED )
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
#T4 時間
update test_ser t set t.tname='m_1' where t.tid=1;
#T5 時間
commit;
6.回到測試會話1
#T6 時間 (再次查詢結果 和 T2 時刻一致)
select tid,tname from test_ser where tid in(1,500);
TID TNAME
1 1 n_1
2 500 n_500
#T7時間 (執行成功)
update test_ser t set t.tname='m_500' where t.tid=500;
#T8時間 (ORA-08117) 因為tid=499 和 會話1 中update的tid=1 的block_id 一樣所以失敗
update test_ser t set t.tname='m_499' where t.tid=499;
#T9時間
select tid,tname from test_ser where tid in(1,500);
TID TNAME
1 1 n_1
2 500 m_500
#T10 時間
commit;
#T11 時間
select tid,tname from test_ser where tid in(1,499,500);
TID TNAME
1 1 m_1
2 499 n_499
3 500 m_500