2020国产成人精品视频,性做久久久久久久久,亚洲国产成人久久综合一区,亚洲影院天堂中文av色

分享

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

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

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

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

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

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

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


查看oracle的文檔對jdbc驅(qū)動的描述:
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 ,這個又是什么意思呢?

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

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

MYSQL和MS SQLServer遵守了這個定義而oracle沒有。oracle只有三種事務(wù)隔離等級:
  • 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


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


有了這個基礎(chǔ)后,再看Connection對象也定義了五個變量和ANSI標(biāo)準(zhǔn)對應(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也不過是在這上面做封裝。TransactionDefinition接口中定義了五個不同的事務(wù)隔離級別:
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;  


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

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

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多