如果只提交一個(gè)查詢(xún),有必要用事務(wù)嗎?這個(gè)問(wèn)題之前已經(jīng)討論過(guò)http://forum./viewtopic.php?t=1603 但是并沒(méi)有得出明確的結(jié)論。先讓我們看看事務(wù)的定義: 引用: Transactions are described in terms of ACID properties, which are as follows:
再看看Oracle對(duì)于只讀事務(wù)的定義: 引用: If you want to run a number of queries against multiple tables and if you are not doing any updating, you prefer a read-only transaction. After indicating that your transaction is read-only, you can run as many queries as you like against any table, knowing that the results of each query are consistent with respect to the same point in time.
而Oracle的只讀查詢(xún)(read-only transaction)則保證了事務(wù)級(jí)別的讀一致性,即在該事務(wù)范圍內(nèi)執(zhí)行的多條SQL都只會(huì)看到執(zhí)行前點(diǎn)的數(shù)據(jù)狀態(tài),而不會(huì)看到事務(wù)期間的任何被其他SQL改變的狀態(tài)。 因此我們可以得出結(jié)論: 如果你一次執(zhí)行單條查詢(xún)語(yǔ)句,則沒(méi)有必要啟用事務(wù)支持,數(shù)據(jù)庫(kù)默認(rèn)支持SQL執(zhí)行期間的讀一致性;
對(duì)于只讀查詢(xún),可以指定事務(wù)類(lèi)型為readonly,即只讀事務(wù)。由于只讀事務(wù)不存在數(shù)據(jù)的修改,因此數(shù)據(jù)庫(kù)將會(huì)為只讀事務(wù)提供一些優(yōu)化手段,例如Oracle對(duì)于只讀事務(wù),不啟動(dòng)回滾段,不記錄回滾log。 在JDBC中,指定只讀事務(wù)的辦法為: 在Hibernate中,指定只讀事務(wù)的辦法為: 在Spring的Hibernate封裝中,指定只讀事務(wù)的辦法為:
我在MySQL4.1試驗(yàn)了一下,過(guò)程和結(jié)果如下: 數(shù)據(jù)庫(kù):MySQL4.1 使用Spring的聲明式事務(wù)管理 試驗(yàn)過(guò)程如下: 不設(shè)置查詢(xún)方法的事務(wù)類(lèi)型(即不需要事務(wù)):訪問(wèn)查詢(xún)頁(yè)面,后臺(tái)執(zhí)行Spring的Bean方法,讓Hibernate發(fā)送select語(yǔ)句,然后手工在MySQL里面修改該記錄某字段值,再訪問(wèn)查詢(xún)頁(yè)面,發(fā)現(xiàn)被修改過(guò)的字段值并沒(méi)有變化,Hibernate輸出的log顯示,數(shù)據(jù)庫(kù)還是把老的字段值返回,而沒(méi)有返回新的字段值。 設(shè)置查詢(xún)方法的事務(wù)類(lèi)型(只讀事務(wù)):訪問(wèn)查詢(xún)頁(yè)面,后臺(tái)執(zhí)行Spring的Bean方法,讓Hibernate發(fā)送select語(yǔ)句,然后手工在MySQL里面修改該記錄某字段值,再訪問(wèn)查詢(xún)頁(yè)面,發(fā)現(xiàn)被修改過(guò)的字段值已經(jīng)變化,Hibernate輸出的log顯示,數(shù)據(jù)庫(kù)返回新的字段值。 這個(gè)試驗(yàn)說(shuō)明,至少在MySQL4.1的InnoDB情況下,不使用只讀事務(wù)的查詢(xún)將無(wú)法讀取到數(shù)據(jù)更新值,必須使用只讀事務(wù)來(lái)保證讀記錄的數(shù)據(jù)一致性。這個(gè)結(jié)果非常令我詫異,和我預(yù)期完全兩樣。 我將在Oracle平臺(tái)上試試看會(huì)有什么樣的結(jié)果。 BTW: 如果MySQL的表類(lèi)型改為MyISAM,那么即使不設(shè)置事務(wù),也不會(huì)出現(xiàn)讀數(shù)據(jù)不一致的現(xiàn)象。
一是用SET TRANSACTION ISOLATION LEVEL SERIALIZABLE ,
|
|
來(lái)自: web.anywhere > 《我的圖書(shū)館》