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