电竞比分网-中国电竞赛事及体育赛事平台

分享

只讀事務(wù)還是只讀模式

 chengkunzhang 2016-02-18
     學(xué)習(xí)spring常常聽(tīng)說(shuō)只讀事務(wù),到底什么是只讀事務(wù)?
“只讀事務(wù)”的提法太過(guò)籠統(tǒng).只讀事務(wù)可以分為兩個(gè)方面:JDBC和數(shù)據(jù)庫(kù)。

JDBC的Connection對(duì)象有一個(gè)方法setReadOnly。JDK的API描述如下:
Java代碼  收藏代碼
  1. Puts this connection in read-only mode as a hint to thedriver to enable   
  2. database optimizations.   

翻譯過(guò)來(lái)的意思“把此連接設(shè)置為只讀模式,作為的數(shù)據(jù)庫(kù)優(yōu)化的暗示”.這里面有事務(wù)隔離嗎?沒(méi)有。甚至SUN的描述都很模糊,只是向數(shù)據(jù)庫(kù)驅(qū)動(dòng)做一個(gè)啟動(dòng)數(shù)據(jù)庫(kù)優(yōu)化的暗示,不代表一定有效。所以不應(yīng)該把readOnly作為打開(kāi)只讀事務(wù)的判斷。
robbin 在只讀查詢(xún)是否需要啟動(dòng)事務(wù)管理,兼論只讀事務(wù)的說(shuō)法并不十分正確:
robbin 寫(xiě)道

在JDBC中,指定只讀事務(wù)的辦法為:
connection.setReadOnly(true);

在Hibernate中,指定只讀事務(wù)的辦法為:
session.setFlushMode(FlushMode.NEVER);
此時(shí),Hibernate也會(huì)為只讀事務(wù)提供Session方面的一些優(yōu)化手段

在Spring的Hibernate封裝中,指定只讀事務(wù)的辦法為:
bean配置文件中,prop屬性增加“readOnly”


查看oracle的文檔對(duì)jdbc驅(qū)動(dòng)的描述:
Java代碼  收藏代碼
  1. Transaction Isolation Levels and Access Modes  
  2. Read-only connections are supported by the Oracle server, but not by the   
  3. Oracle JDBC drivers.  

Oracle服務(wù)器支持Read-only ,這個(gè)又是什么意思呢?

為了搞清楚這個(gè)所謂的“只讀事務(wù)”必須先明確一個(gè)概念--“事務(wù)隔離級(jí)別(transaction isolation degree)”,ANSI標(biāo)準(zhǔn)定義了4個(gè)隔離級(jí)別標(biāo)準(zhǔn):
  • READ UNCOMMITTED:最低級(jí)別的隔離,通常又稱(chēng)為dirty read,它允許一個(gè)事務(wù)讀取還沒(méi)commit的數(shù)據(jù),這樣可能會(huì)提高性能,但是dirty read可能不是我們想要的。
  • READ COMMITTED:在一個(gè)事務(wù)中只允許已經(jīng)commit的記錄可見(jiàn)。如果session中select還在查詢(xún)中,另一session此時(shí)insert一條記錄,當(dāng)前事務(wù)可以看到修改的記錄,從而產(chǎn)生不可重復(fù)讀取和幻像數(shù)據(jù)。
  • REPEATABLE READ:在一個(gè)事務(wù)開(kāi)始后,其他session對(duì)數(shù)據(jù)庫(kù)的修改在本事務(wù)中不可見(jiàn),直到本事務(wù)commit或rollback。在一個(gè)事務(wù)中重復(fù)select的結(jié)果一樣,除非本事務(wù)中update數(shù)據(jù)庫(kù)。  
  • SERIALIZABLE:最高級(jí)別的隔離,只允許事務(wù)串行執(zhí)行。為了達(dá)到此目的,數(shù)據(jù)庫(kù)會(huì)鎖住每行已經(jīng)讀取的記錄,其他session不能修改數(shù)據(jù)直到前一事務(wù)結(jié)束,事務(wù)commit或取消時(shí)才釋放鎖。

主流數(shù)據(jù)庫(kù)的一般的默認(rèn)是READ COMMITTED級(jí)別。

MYSQL和MS SQLServer遵守了這個(gè)定義而oracle沒(méi)有。oracle只有三種事務(wù)隔離等級(jí):
  • Read committed
  • Serializable
  • Read-only Read-only transactions see only those changes that were committed at the time the transaction began and do not allow INSERT, UPDATE, and DELETE statements


前兩個(gè)Read committed,Serializable 和ANSI的定義是一致的,來(lái)看看最關(guān)鍵的第三個(gè)Read-only 。Read-only事務(wù)只會(huì)看到在這個(gè)事務(wù)開(kāi)啟時(shí)間點(diǎn)其他事務(wù)提交過(guò)的數(shù)據(jù),并且不允許執(zhí)行INSERT, UPDATE,DELETE語(yǔ)句,換句話說(shuō),在設(shè)置set transaction read only后,當(dāng)前會(huì)話所見(jiàn)的數(shù)據(jù)圖像,將不再受到其他會(huì)話事務(wù)的影響。
所以oracle支持的只讀事務(wù)不是為了優(yōu)化性能,而是為了讓這個(gè)事務(wù)中所有的查詢(xún)操作看到的數(shù)據(jù)是一個(gè)時(shí)間點(diǎn)(開(kāi)啟事務(wù))上的一致數(shù)據(jù)。MYSQL,SQL_SERVER根本沒(méi)有只讀事務(wù)的概念,但是有REPEATABLE READ,具體看之間的差別。


有了這個(gè)基礎(chǔ)后,再看Connection對(duì)象也定義了五個(gè)變量和ANSI標(biāo)準(zhǔn)對(duì)應(yīng):

Java代碼  收藏代碼
  1. int TRANSACTION_NONE  =0;    //不受支持的事務(wù)  
  2. int TRANSACTION_READ_COMMITTED =1;  
  3. int TRANSACTION_READ_UNCOMMITTED = 2;  
  4. int TRANSACTION_REPEATABLE_READ = 4;  
  5. int TRANSACTION_SERIALIZABLE  =8;  


而Spring也不過(guò)是在這上面做封裝。TransactionDefinition接口中定義了五個(gè)不同的事務(wù)隔離級(jí)別:
Java代碼  收藏代碼
  1. int ISOLATION_DEFAULT = -1;  
  2. int ISOLATION_READ_UNCOMMITTED = Connection.TRANSACTION_READ_UNCOMMITTED;  
  3. int ISOLATION_READ_COMMITTED = Connection.TRANSACTION_READ_COMMITTED;  
  4. int ISOLATION_REPEATABLE_READ = Connection.TRANSACTION_REPEATABLE_READ;  
  5. int ISOLATION_SERIALIZABLE = Connection.TRANSACTION_SERIALIZABLE;  


既然沒(méi)有只讀事務(wù)的概念,那么提交一個(gè)查詢(xún)是否需要開(kāi)啟一個(gè)事務(wù)呢?
不同的數(shù)據(jù)庫(kù)可能有不同實(shí)現(xiàn),oracle驅(qū)動(dòng)的文檔介紹:
如果關(guān)閉Disabling Auto-Commit Mode可以提高一定的性能。
但是MYSQL好像相反,參見(jiàn):http://www./topic/1603?page=1

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多