ssh中處理事務(wù)的幾種方式

事務(wù),就是保證一系列業(yè)務(wù)邏輯全部執(zhí)行或者全部不執(zhí)行,在開(kāi)發(fā)中,事務(wù)是怎么控制的呢?
方法一、使用hibernate的OpenSession()。這種方式需要在業(yè)務(wù)邊界創(chuàng)建session,并將session作為參數(shù)傳遞到Dao層,以此來(lái)保證多個(gè)業(yè)務(wù)邏輯之間使用的是同一個(gè)session。

         添加用戶的同時(shí)要完成addLog()和addUser()兩個(gè)操作:
           1. LogManagerImpl類(lèi)中的添加日志

          public void addLog(Log log,Session session){
                  session.save(log,session);
           }
  1. UserManagerImpl類(lèi)中完成所有業(yè)務(wù)邏輯
//openSession()創(chuàng)建session    
SessionFactory factory= new Configuration().configure();  
Session session=factory.openSession();            
//開(kāi)啟事務(wù)           
session.beginTransaction();           
//執(zhí)行業(yè)務(wù)邏輯1. 保存user      
session.save(user);                
//Log和LogManagerImpl的創(chuàng)建由IoC控制                        
log.setTime(new Date());      
log.setType("操作日志");                
//執(zhí)行業(yè)務(wù)邏輯2. 保存log,同時(shí)傳遞session           
logManager.addLog(log,session);                   
session.getTransaction().commit();           
//使用openSession,當(dāng)最后一個(gè)業(yè)務(wù)邏輯完成后必須關(guān)閉session           
session.close();  
 方法二、 使用Hibernate的getCurrentSession(),currentSession和openSession的區(qū)別在于,使用currentSession使用完畢后不用手動(dòng)關(guān)閉session。currentSession相當(dāng)于將session放到一個(gè)ThreadLocal中。
  1. LogManagerImpl類(lèi)

       pubic  void addLog(Log log){
    
             //可以通過(guò)getCurrentSession()創(chuàng)建Session,不必使用傳遞的session
    
            Session session= factory.getCurrentSession()
    
            session.save(log);
    
     }
    
  2. UserManagerImpl類(lèi)中完成所有業(yè)務(wù)邏輯

 //openSession()創(chuàng)建session        
SessionFactory factory= new Configuration().configure();        
Session session=factory.getCurrentSession();                
//開(kāi)啟事務(wù)               
session.beginTransaction();               
//執(zhí)行業(yè)務(wù)邏輯1. 保存user          
session.save(user);                    
//Log和LogManagerImpl的創(chuàng)建由IoC控制                            
log.setTime(new Date());          
log.setType("操作日志");                    
//執(zhí)行業(yè)務(wù)邏輯2. 保存log              
logManager.addLog(log);                       
session.getTransaction().commit();               
//使用currentSession,當(dāng)最后一個(gè)業(yè)務(wù)邏輯完成后不用關(guān)閉session
  1. 使用currentSession,需要在hibernate.cfg.xml配置文件中開(kāi)啟事務(wù)
<property name="hibernate.current_session_context_class">thread</property>

方案三、將hibernate和spring集成,使用spring框架的聲明式事務(wù)。使用spring的聲明式事務(wù),不再需要自動(dòng)創(chuàng)建sessionFactory和Session,不再需要手動(dòng)控制事務(wù)的開(kāi)啟和關(guān)閉。
使用spring聲明式事務(wù)的幾個(gè)步驟:
1. applicationContext.xml中進(jìn)行配置

<!-- 配置spring事務(wù)管理器-->
    <bean id="transactionManager"
        class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="qq"></property>
    </bean>
    <!-- 配置spring事務(wù),基于xml開(kāi)發(fā)-->
    <!-- 激活自動(dòng)代理 -->
    <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
    <!-- 配置aop -->
    <aop:config>
    <aop:pointcut expression="execution(* com.hw.service.impl.*.*(..))" id="pointcut"/>
    <aop:advisor advice-ref="trcut" pointcut-ref="pointcut"/><!-- 增強(qiáng)切 -->
    </aop:config>
    <!-- 定義事務(wù)通知 -->
    <tx:advice id="trcut" transaction-manager="transactionManager">
    <!-- 定義事務(wù)傳播規(guī)則 -->
    <tx:attributes>
    <!-- REQUIRED的含義是支持當(dāng)前已經(jīng)存在的事務(wù),如果還沒(méi)有事務(wù),就創(chuàng)建一個(gè)新事務(wù) 
    <tx:method name="*" propagation="REQUIRED"/> 
    表示所有方法都應(yīng)用REQUIRED事務(wù)規(guī)則-->
    <tx:method name="add*" propagation="REQUIRED"/>
    <tx:method name="update*" propagation="REQUIRED"/>
    <tx:method name="del*" propagation="REQUIRED"/>
    <tx:method name="*" propagation="REQUIRED" read-only="true"/>
    </tx:attributes> 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,537評(píng)論 19 139
  • 很多人喜歡這篇文章,特此同步過(guò)來(lái) 由淺入深談?wù)搒pring事務(wù) 前言 這篇其實(shí)也要?dú)w納到《常識(shí)》系列中,但這重點(diǎn)又...
    碼農(nóng)戲碼閱讀 4,916評(píng)論 2 59
  • 這部分的參考文檔涉及數(shù)據(jù)訪問(wèn)和數(shù)據(jù)訪問(wèn)層和業(yè)務(wù)或服務(wù)層之間的交互。 Spring的綜合事務(wù)管理支持覆蓋很多細(xì)節(jié),然...
    竹天亮閱讀 1,095評(píng)論 0 0
  • 5.Spring的事務(wù) 通常情況下,J2EE有2種事務(wù)管理方式:全局事務(wù)和本地事務(wù),2種事務(wù)都比較明顯的缺陷。 全...
    FTOLsXD閱讀 1,577評(píng)論 0 8
  • 這部分主要是開(kāi)源Java EE框架方面的內(nèi)容,包括Hibernate、MyBatis、Spring、Spring ...
    雜貨鋪老板閱讀 1,556評(píng)論 0 2

友情鏈接更多精彩內(nèi)容