TRANSACTION_NONE:
正式地講,TRANSACTION_NONE不是一個有效的事務級別。
根據(jù)java.sql Connection API文件,這個級別表示事務是
不被支持的,因此理論上說你不能使用TRANSACTION_NONE作
為一個自變量賦給Connection.setTransactionIsolation()
方法。事實上,雖然一些數(shù)據(jù)庫實施了這個事務級別,但是
Oracle9i卻沒有實施。
臟讀取(TRANSACTION_READ_UNCOMMITTE):
(允許的操作 讀-讀 讀-寫 寫-讀 (臟數(shù)據(jù),不可重復讀,虛讀) )
表示,這個事務級別
允許讀取臟數(shù)據(jù),什么是臟數(shù)據(jù)?就是指還沒有提交的數(shù)據(jù).
因為這個級別,是允許一個事務(A)讀取另一個事務(B)
還沒有提交的數(shù)據(jù).一旦事務B發(fā)生異常退出.而修改了的數(shù)據(jù)
卻還沒提交,或者新插入的數(shù)據(jù)和刪除了的數(shù)據(jù)都還沒有
提交,導致事務A拿到了一些臟數(shù)據(jù),或者錯誤數(shù)據(jù);
因此在這個事務級別里是會發(fā)生臟讀,重復讀,錯誤讀取;
禁止臟讀(TRANSACTION_READ_COMMITTED):
(允許的操作 讀-讀 讀-寫 (不可重復讀,虛讀))
在這個級別中,事務A
只能讀取一些提交的數(shù)據(jù),如事務B添加了一條記錄,但是
如果事務B沒有提交,那么事務A是讀不到的,所以該事務級別,
把臟讀給屏蔽掉了.---卻允許重復讀取,和錯誤讀取.
什么是重復讀取呢?譬如,事務A讀取了一個數(shù)據(jù),這個數(shù)據(jù)
的值為"helloworld",事務A準備利用這個數(shù)據(jù)來更新一下
其他數(shù)據(jù),但這個時候事務B開始對這個數(shù)據(jù)進行修改,并且
提交---"hello 無名氏",由于是已經(jīng)提交了,所以事務A是可以
看到這個數(shù)據(jù)的,當事務A在沒提交事務之前,它想看下數(shù)據(jù)
是否正確,這個時候它發(fā)現(xiàn),新讀出的數(shù)據(jù)已經(jīng)和原來的數(shù)據(jù)
不一樣了(這就是重復讀取);
允許重復讀取(TRANSACTION_REPEATABLE_READ):
(允許的操作 讀-讀 讀-寫(僅允許插入,不允許刪除和修改)(虛讀))
在這個級別中,
是禁止了臟讀,和取消了不可重復讀取,但是沒有禁止錯誤讀取;
這個級別的事務比較嚴格,當一個事務A在讀取一個值的時候
是不允許另一個事務對該值進行修改的;
為了允許重復讀取,可以選用該級別,因為TRANSACTION_READ_
COMMITED這個事務級別,是允許重復讀取提交的數(shù)據(jù)的,如果
事務A在讀取一個數(shù)值的時候,值為"Hello World!",但這個時
候事務B對"Hello World"值進行修改了,改為"Hello EveryOne"
然后提交,當事務A再次去讀取這個值的時候,去發(fā)現(xiàn)原來讀到
的值改變了,變成了"Hello EveryOne",為了防止出現(xiàn)這種情況
可以禁止重復提交,目的是為了重復讀取不會出錯!那么這個
時候就可以選擇
TRANSACTION_REPEATABLE_READ這個級別,
這個級別就是用來禁止重復提交的.
(實際上是加了行鎖,鎖定了選中的數(shù)據(jù),不允許修改,但是允許插入新的數(shù)據(jù))
雖然這個時候是禁止了重復提交,但卻可以添加刪除,
比如事務A,作了個查詢語句"select * from 無名氏 "; 這個時候是允許事務B做這樣的操作的:
"insert into 無名氏 values(2,'aaa')"; 這個時候,
事務A再次做讀取操作的時候,卻發(fā)現(xiàn)數(shù)據(jù)莫名其妙的
多了一條,這就是所謂的---幻影讀取;
禁止幻讀(TRANSACTION_SERIALIZABLE):
事務的最高級別(串行化 操作)事務級別最高,所耗費的性能也越多.
禁止幻讀禁止了臟讀,禁止了重復提交和幻讀.
也就是當事務A在按條件查詢的時候,事務A一旦沒有提
交,任何事務都不能對事務A的資源進行操作--- 保證
事務A的操作真正的原子性!
注意:在Oracle中只支持兩種級別:
TRANSACTION_READ_COMMITTED(默認的級別)(只有提交后
才可以讀取)而每一個終端進行自己的DML操作 都自動開啟了一個事務
TRANSACTION_SERIALIZABLE(竄行化操作)