[20130125]DML操作出現交集的情況[補充].txt
[20130125]DML操作出現交集的情況[補充].txt
昨天同事問了一個問題,如果DML操作出現交叉的情況下,oracle是如何處理的?
對前面再做一些補充。
http://space.itpub.net/267265/viewspace-753269
我自己還是建立一個測試例子來說明:
1.建立測試環境:
SQL> select * from v$version where rownum<=1;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
CREATE TABLESPACE aaa DATAFILE
'/u01/app/oracle11g/oradata/test/aaa01.dbf' SIZE 10M AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED
LOGGING
PERMANENT
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
BLOCKSIZE 8K
SEGMENT SPACE MANAGEMENT MANUAL
FLASHBACK ON;
--建立表空間mssm主要目的是演示可以重複,保持插入的資料順序與顯示的資訊一致。
create table t tablespace aaa as select rownum id1 ,1 id2 ,'aaaa' name from dual connect by level<=3;
alter table t minimize records_per_block;
--這樣限制每個資料塊3條記錄
insert into t select rownum id1 ,2 id2 ,'bbbb' name from dual connect by level<=3;
insert into t select rownum id1 ,3 id2 ,'cccc' name from dual connect by level<=3;
commit ;
9 rows selected.
--注意我表空間是mssm,顯示的資料與插入的資料一致。
--從rowid也可以看出資料分佈在3個塊中。
2.開始測試:
--開啟回話1,修改資料不提交:
SQL1> update t set name='3333' where id2=2;
SQL1> select dbms_transaction.local_transaction_id z10 from dual;
Z10
----------
9.14.10234
--開啟回話2,修改資料不提交:
SQL2> update t set name='2222' where id1=2;
--這樣第2個回話也會修改了id1=2,id2=2的行記錄,出現阻塞,回話掛起。
--開啟回話3執行如下:
--從顯示可以看出,第1行資訊與回話1的資訊相符合。第2行自然與第2個回話有關。
--這個時候如果在第3個回話執行update t set name='xxxx' where id1=2 and id2=3;可行嗎?會掛起嗎?
--從前面的演示可以推出應該沒有問題,因為在id1=2,id2=2時出現阻塞,但是這個時候id1=2 and id2=3還沒有操作。
SQL3> update t set name='xxxx' where id1=2 and id2=3;
1 row updated.
但是如果執行update t set name='xxxx' where id1=2 and id2=1;應該會出現阻塞情況。
SQL3> update t set name='xxxx' where id1=2 and id2=1;
作為前面的補充,更好的理解這些問題。
昨天同事問了一個問題,如果DML操作出現交叉的情況下,oracle是如何處理的?
對前面再做一些補充。
http://space.itpub.net/267265/viewspace-753269
我自己還是建立一個測試例子來說明:
1.建立測試環境:
SQL> select * from v$version where rownum<=1;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
CREATE TABLESPACE aaa DATAFILE
'/u01/app/oracle11g/oradata/test/aaa01.dbf' SIZE 10M AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED
LOGGING
PERMANENT
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
BLOCKSIZE 8K
SEGMENT SPACE MANAGEMENT MANUAL
FLASHBACK ON;
--建立表空間mssm主要目的是演示可以重複,保持插入的資料順序與顯示的資訊一致。
create table t tablespace aaa as select rownum id1 ,1 id2 ,'aaaa' name from dual connect by level<=3;
alter table t minimize records_per_block;
--這樣限制每個資料塊3條記錄
insert into t select rownum id1 ,2 id2 ,'bbbb' name from dual connect by level<=3;
insert into t select rownum id1 ,3 id2 ,'cccc' name from dual connect by level<=3;
commit ;
SQL1> select rowid,a.* from t a;
ROWID ID1 ID2 NAME
------------------ ---------- ---------- --------------------------------------------------
AABBqUAALAAAACBAAA 1 1 aaaa
AABBqUAALAAAACBAAB 2 1 aaaa
AABBqUAALAAAACBAAC 3 1 aaaa
AABBqUAALAAAACCAAA 1 2 bbbb
AABBqUAALAAAACCAAB 2 2 bbbb
AABBqUAALAAAACCAAC 3 2 bbbb
AABBqUAALAAAACDAAA 1 3 cccc
AABBqUAALAAAACDAAB 2 3 cccc
AABBqUAALAAAACDAAC 3 3 cccc
9 rows selected.
--注意我表空間是mssm,顯示的資料與插入的資料一致。
--從rowid也可以看出資料分佈在3個塊中。
2.開始測試:
--開啟回話1,修改資料不提交:
SQL1> update t set name='3333' where id2=2;
SQL1> select dbms_transaction.local_transaction_id z10 from dual;
Z10
----------
9.14.10234
--開啟回話2,修改資料不提交:
SQL2> update t set name='2222' where id1=2;
--這樣第2個回話也會修改了id1=2,id2=2的行記錄,出現阻塞,回話掛起。
--開啟回話3執行如下:
SQL3> select addr, xidusn, xidslot, xidsqn, ubafil, ubablk, ubasqn, ubarec,status, start_time, start_scnb, start_scnw, ses_addr from v$transaction;
ADDR XIDUSN XIDSLOT XIDSQN UBAFIL UBABLK UBASQN UBAREC STATUS START_TIME START_SCNB START_SCNW SES_ADDR
---------------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------------- -------------------- ---------- ---------- ----------------
00000000B5634500 9 14 10234 3 3153 5252 21 ACTIVE 01/25/13 14:50:49 3221937355 0 00000000B51B7E98
00000000BF9BC378 11 31 1761 3 4635 1095 42 ACTIVE 01/25/13 14:52:25 3221937397 0 00000000B616F910
--從顯示可以看出,第1行資訊與回話1的資訊相符合。第2行自然與第2個回話有關。
--這個時候如果在第3個回話執行update t set name='xxxx' where id1=2 and id2=3;可行嗎?會掛起嗎?
--從前面的演示可以推出應該沒有問題,因為在id1=2,id2=2時出現阻塞,但是這個時候id1=2 and id2=3還沒有操作。
SQL3> update t set name='xxxx' where id1=2 and id2=3;
1 row updated.
但是如果執行update t set name='xxxx' where id1=2 and id2=1;應該會出現阻塞情況。
SQL3> update t set name='xxxx' where id1=2 and id2=1;
作為前面的補充,更好的理解這些問題。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-753333/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [20130125]DML操作出現交集的情況.txt
- 透過閃回事務檢視資料dml的情況
- 通過閃回事務檢視資料dml的情況
- phpredis 3.1.6 擴充套件,出現指定 database 無效的情況。PHPRedis套件Database
- [20231011]查詢sys.optstat_snapshot$瞭解表的DML情況.txt
- Postgrsql 從節點當機,主節點執行DML語句出現等待情況SQL
- Laravel 使用 phpredis 擴充套件之後,出現指定 database 無效的情況。LaravelPHPRedis套件Database
- [20200219]strace跟蹤設定ENABLE=BROKEN的情況(網路的情況).txt
- [20161012]linux free的補充.txtLinux
- [20120601]ITL的問題補充.txt
- 關於Oracle LOGMNR找不到dml操作及補充日誌相關Oracle
- [20231024]NULL值在索引的情況.txtNull索引
- [20170406]查詢佔用記憶體情況.txt記憶體
- mac下安裝Vue DevTools出現已停用不支援的擴充套件程式情況MacVuedev套件
- php倒數計時出現-0的情況PHP
- [20160407]bbed修改檔案頭2(補充).txt
- [20180105]oracle臨時表補充.txtOracle
- [20241016]Oracle C functions annotations補充.txtOracleFunction
- mysql索引失效的情況MySql索引
- NoClassDefFoundError的兩種情況Error
- ArcMap屬性表出現亂碼情況的解決
- 如何實現多個版本的jQuery庫共存的情況jQuery
- <img>標籤的src=""空字元會出現的情況字元
- [20170916]sqlplus set array最小2補充.txtSQL
- [20120809]學習物化檢視(補充).txt
- 【BUG】關於手動打包、ANT實現的 補充
- 有關元件的補充~~~~~~~元件
- iOS-framework的補充iOSFramework
- vi的補充學習
- halcon學習擴充系列—交集intersection的擴充運算元intersection_expand
- java空指標出現的情況:拆箱裝箱Java指標
- 如何在不開啟txt檔案的情況下,修改utf-8為ansi格式
- [20220603]測試quiz night(補充).txtUI
- [20211013]測試遠端監聽補充.txt
- Mysql 可能鎖表的情況MySql
- Oracle其它情況的恢復Oracle
- DOM對映的特殊情況
- JVM補充篇JVM