事務隔離級別

數據庫中,讀取數據時常見的幾種情況:
Dirty Read:A transaction reads data that has been written by another transaction that has not been committed yet.
Fuzzy Read:A transaction rereads data it has previously read and finds that another committed transaction has modified or deleted the data.
Phantom Read:A transaction reruns a query returning a set of rows that satisfies a search condition and finds that another committed transaction has 
inserted additional rows that satisfy the condition.
上述文字可概括爲:
1.髒讀:讀取未提交的數據;
2.模糊讀:讀取已變動的數據;
3.幻讀:讀取已提交的數據。

在oracle中,僅定義了兩種級別的隔離等級,分別是READ COMMITTED、SERIALIZABLE。
------------------	------------------	------------------	------------------
Isolation Level		Dirty Read		Fuzzy Read		Phantom Read
------------------	------------------	------------------	------------------
READ COMMITTED		no			yes			yes
------------------	------------------	------------------	------------------
SERIALIZABLE		no			no			no
------------------	------------------	------------------	------------------
由上表可知,oracle是不允許髒讀的。

舉例:
--會話1
create table t_isolation(id integer,name varchar2(10));
insert into t_isolation(id,name) values (1,'a');
commit;

--會話2
set transaction isolation level read committed;
select * from t_isolation;

--會話1
--不提交
insert into t_isolation(id,name) values (2,'b');

--會話2
select * from t_isolation;
執行查詢,發現查詢不到剛插入的數據
update t_isolation set name='c' where id=2;
執行更新,發現無數據可更新
delete from t_isolation where id=2;
執行刪除,發現無數據可刪除

--會話1
commit;

--會話2
select * from t_isolation;
執行查詢,發現可以查詢到剛插入的數據
既然可查詢到剛插入的數據,那麼更新和刪除自然也沒問題,這裏就不詳細舉例了。

--會話3
set transaction isolation level serializable;
select * from t_isolation;

--會話1
--不提交
delete from t_isolation where id=2;

--會話3
select * from t_isolation;
發現刪除的數據可查詢到

--會話1
commit;

--會話3
select * from t_isolation;
發現刪除的數據可查詢到

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章