1. 程式人生 > >spring 事務 FlushMode屬性的理解

spring 事務 FlushMode屬性的理解

一、參見hibernate的api

http://tool.oschina.net/apidocs/apidoc?api=hibernate-3.6.10

http://tool.oschina.net/apidocs/apidoc?api=hibernate-4.1.4

說明:貼出兩個版本的原因在於FlushMode屬性在3.6與4.1版本的設定有所不同,3.6的FlushMode屬性是一個Class類,而4.1已更換了Enum。

二、 FlushMode屬性(策略)

在org.hibernate Class FlushMode中這樣解釋它的作用:Represents a flushing strategy. The flush process synchronizes database state with session state by detecting state changes and executing SQL statements.

代表一個flushing(重新整理)的策略,它將通過改變session的狀態和執行SQL的狀態來處理執行緒中的資料。 

NEVER 已被

AUTO 在確保查詢從不會返回髒資料的情況下,在查詢前重新整理Session

說明:

1. Session:Session介面是Hibernate向程式提供操縱資料庫的最主要介面,是單執行緒物件,它提供了基本的儲存、更新、刪除和查詢方法。它有一個快取,儲存了持久化物件,當清理快取時,按照這些持久化物件同步更新資料庫。根據Session的定義,可以知道重新整理Session也就重新整理了資料庫。

2.呼叫Session.flush()

方法,不管FlushMode被設定成任何策略,均會將重新整理Session,使其中的快取資料同步至資料庫。

3.與AUTO的區別:從API看出,AUTO的解釋Session重新整理較多了一個“sometimes ”,說明AUTO並不會像那樣總是重新整理,那它在何時才會重新整理呢?當hibernate快取中的物件被改動之後,會被標記為髒資料(即與資料庫不同步了)。當 session設定為FlushMode.AUTO時,hibernate在進行查詢的時候會判斷快取中的資料是否為髒資料,是則刷資料庫,不是則不刷,而always是直接重新整理,不進行任何判斷。很顯然auto比always要高效得多。

4.設定FlushMode.,在操作過程中hibernate會將事務設定為readonly,所以在增加、刪除或修改操作過程中會出現如下錯誤:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.

 解決方式見“附:解決因FlushMode設定出現不能進行增、刪、改的異常”

用表格形式表示如下:

表1

呼叫Session的查詢方法時

呼叫Session.commit()時

呼叫Session.flush()時

AUTO

當快取被標記為髒資料時,重新整理

重新整理

重新整理

三、小結:FlushMode的4個屬性實際上代表了Hibernate處理Session中的持久化物件的快取的4種策略,這4種策略最大的不同就是重新整理Session,將其中的快取的持久化物件同步更新資料庫的時間點不同。

四、OpenSessionInViewFilter的FlushMode屬性設定與transaction(spring注入的事務)的關係:假設在OpenSessionInViewFilter設定FlushMode.若OpenSessionInViewFilter在getSession的時候,會把獲取回來的session的flush mode 設為FlushMode.。然後把該sessionFactory繫結到TransactionSynchronizationManager,使request的整個過程都使用同一個session,在請求過後再解除該sessionFactory的繫結,最後closeSessionIfNecessary根據該session是否已和transaction繫結來決定是否關閉session。在這個過程中,若HibernateTemplate 發現自當前session有不是readOnly的transaction,就會獲取到FlushMode.AUTO Session,使方法擁有寫許可權。也即是,如果有不是readOnly的transaction就可以由Flush.NEVER轉為Flush.AUTO,擁有insert,update,delete操作許可權,如果沒有transaction,並且沒有另外人為地設flush model的話,則doFilter的整個過程都是Flush.MANUAL。所以受transaction保護的方法有寫許可權,沒受保護的則沒有。

附:解決因FlushMode設定出現不能進行增、刪、改的異常

1.配置事務,spring會讀取事務中的各種配置來覆蓋hibernate的session中的FlushMode。此種情況下,即使在FlushMode設定也沒有關係(這並意味OpenSessionInViewFilter的FlushMode屬性可以隨意設定,這得依據實際需求,具體參見第四點--OpenSessionInViewFilter的FlushMode屬性設定與transaction(spring注入的事務)的關係)。

例:

<bean id="txManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    <aop:config>
        <aop:pointcut id="managerOperation"
            expression="execution(* com.test.service.*.*(..))"/>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="managerOperation" />
    </aop:config>
    <tx:advice id="txAdvice" transaction-manager="txManager">
        <tx:attributes>
            <tx:method name="*"  propagation="REQUIRED" read-only="true" />
            <tx:method name="save*" propagation="REQUIRED" />
            <tx:method name="add*"  propagation="REQUIRED" />
            <tx:method name="del*"  propagation="REQUIRED" />
            <tx:method name="update*" propagation="REQUIRED" isolation="REPEATABLE_READ"/>
        </tx:attributes>
    </tx:advice>  
2.直接修改opensessioninviewfilter過濾器的配置,配置過濾器的時候置 openSession org.springframework.orm.hibernate3.support.OpenSessionInViewFilter中 flushMode為AUTO/COMMIT 。注意:如果這樣設定,則要麼結合1,要麼結合3,因為不管怎樣,對於Hibernate來說總是要配置事務,否則無法操作持久化物件同步至資料庫。

例:

<filter>
        <filter-name>openSessionInViewFilter</filter-name>
        <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
        <init-param>
            <param-name>singleSession</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>flushMode</param-name>
            <param-value>AUTO</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>openSessionInViewFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

3.先程式設計式修改FlushMode,比如session.setFlushMode(FlushMode.AUTO); 

例:

@Override
    public void saveOrUpdate(T t) {
        Session session = null;
        Transaction tr = null;
        try {
            session = HibernateSessionFactory.getSession();
            tr = session.beginTransaction();
            session.saveOrUpdate(t);
            tr.commit();
            HibernateSessionFactory.closeSesssion();
        } catch (Exception e) {
            e.printStackTrace();
            tr.rollback();
        }
    }

相關推薦

spring 事務 FlushMode屬性理解

一、參見hibernate的api http://tool.oschina.net/apidocs/apidoc?api=hibernate-3.6.10 http://tool.oschina.net/apidocs/apidoc?api=hibernate-4.1.4 說明:貼出兩個版本的原因在

spring事務傳播性理解

code 捕獲 就會 拋出異常 事務 支持 tro 復制代碼 區分 什麽是spring的事務傳播性 個人的理解, 首先先說一下事務傳播性,事務傳播性就是,事務中還包括另外的事務,事務之間是怎麽相互影響,然後如何執行的,這就是事務傳播性 spring事務傳播性就是spring

spring事務傳播屬性,隔離級別

package org.springframework.transaction; import java.sql.Connection; /** * Interface that defines Spring-compliant transaction properties. * Based

Spring事務傳播屬性和隔離級別

事務的傳播屬性(Propagation) @Transactional(propagation=Propagation.REQUIRED):這個是預設的屬性。如果存在一個事務,則支援當前事務。如果沒有事務則開啟一個新的事務。被設定成這個級別時,會為每一個被呼

Spring事務傳播屬性和級別

什麼是髒資料,髒讀,不可重複讀,幻覺讀? 髒讀:            指當一個事務正在訪問資料,並且對資料進行了修改,而這種修改還沒有提交到資料庫中,這時,                     另外一個事務也訪問這個資料,然後使用了這個資料。因為這個資料是還沒有提交的資料, 那麼另外一         

Spring事務傳播屬性介紹(二).mandatory、not_supported、never、supports

Required、Required_New傳播屬性分析傳送門:https://www.cnblogs.com/lvbinbin2yujie/p/10259897.html Nested傳播屬性分析傳送門:https://www.cnblogs.com/lvbinbin2yujie/p/10260066.ht

Spring事務傳播屬性介紹(三).Nested

Required、Required_New傳播屬性分析傳送門:https://www.cnblogs.com/lvbinbin2yujie/p/10259897.html Mandatory、Never、Not_Support傳播屬性分析傳送門:https://www.cnblogs.com/lvbinbi

Spring 事務 rollbackFor屬性

預設情況下,在遇到執行時異常和Error,Spring事務會進行回滾,而遇到非執行時異常Exception則不會回滾 可以通過rollbackFor指定需要回滾的受檢查異常,指定異常之後,被指定的異常

spring事務再次理解

@override rop oid span ota title nbsp stock java 2.2.3 只讀 事務的第三個特性是它是否為只讀事務。如果事務只對後端的數據庫進行該操作,數據庫可以利用事務的只讀特性來進行一些特定的優化。通過將事務設置為只讀,你就可以給數

理解 spring 事務傳播行為與數據隔離級別

spa 之間 項目 ext 基本 lock bbb 事務管理 only 事務,是為了保障邏輯處理的原子性、一致性、隔離性、永久性。 通過事務控制,可以避免因為邏輯處理失敗而導致產生臟數據等等一系列的問題。 事務有兩個重要特性: 事務的傳播行為 數據隔離級別 1、事務傳播

透徹理解Spring事務設計思想之手寫實現

數據庫操作 cal 了解 hashmap 個數 這一 use action 管道 前言 事務,是描述一組操作的抽象,比如對數據庫的一組操作,要麽全部成功,要麽全部失敗。事務具有4個特性:Atomicity(原子性),Consistency(一致性),Isolation(隔離

spring事務的隔離級別(透徹理解

wired pan 用戶 出現 不同的 而且 之前 () b- 1.spring 事務這個東西,是輪子,每個service,都需要用到。所以幹脆就做在框架層實現。 2.spring是怎麽給你的service方法加事務的呢?jdk動態代理,會針對每個service類裏

深入理解 Spring 事務原理

順序 etc wid efi 這一 tran source 所在 回滾 一、事務的基本原理 Spring事務的本質其實就是數據庫對事務的支持,沒有數據庫的事務支持,spring是無法提供事務功能的。對於純JDBC操作數據庫,想要用到事務,可以按照以下步驟進行: 獲取連接

spring事務自己再理解的,required,new,nested

先假設A是大方法,B是小方法 required,A沒有事務時呼叫B方法(B的事務隔離級別是required),B就會開啟自己單獨的事務,B要回滾的話,也是回滾B。A有事務時,B就加入到A這個事務(B不開啟自己的事務了),這裡發生回滾的話,AB的事務就都被回滾了。 new , A沒有事務時呼叫

spring事務管理實現原理-原始碼-傳播屬性-工作小結

本部落格分為兩點,一個是spring事務實現原理原始碼解讀(個人能力,初步解讀),二是spring事務的傳播屬性   簡單案例,儲存訂單,修改商品數量 就是這兩個方法,第一個方法中引用了第二個方法,都用@Transactional註解。debug呼叫shoppi

Spring 事務——事務的幾個基本屬性

事務屬性 上文的例子中,在宣告事務時,用到了@Transactional(readOnly = false, propagation = Propagation.REQUIRED)。 中間的引數readOnly,propagation我們稱為事務屬性。它就是對事務的基本配置。事務屬性有五

spring事務管理,基於xml配置完成事務回滾;spring中資料庫表中欄位名和pojo中屬性名不一致時候,實現RowMapper介面手動封裝

宣告使用JDK8,spring5.0.7, 測試說明: service 層 宣告介面進行轉賬,從A轉賬B ,然後對AB 進行更新操作,在事務中對find方法開啟 只讀許可權,無法進行更新操作,造成事務回滾進行測試事務; 主要測試方法:* void tra

深入理解Spring事務原理

事務的基本原理 Spring事務的本質其實就是資料庫對事務的支援,沒有資料庫的事務支援,spring是無法提供事務功能的。 對於純JDBC操作資料庫,想要用到事務,可以按照以下步驟進行: 1、獲取連線 Connection con = DriverManager.getCo

Spring事務異常回滾。TransactionAspectSupport(學習理解

例:      類似這樣的方法不會回滾 (一個方法出錯,另一個方法不會回滾) :   if(userSave){    try {    userDao.save(user);

關於spring事務原始碼的一些小理解

1、spring事務的簡單概述 由於實現事務功能的方式各不相同,Spring進行了統一的抽象,形成了PlatformTransactionManager事務管理器頂級介面(平臺事務管理器),事務的提交、回滾等操作全部交給它來實現 先來看下三大介面 PlatformTransactionManage