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