ssh中处理事务的几种方式

转自:http://blog.csdn.net/liusong0605/article/details/8440842

   事务,就是保证一系列业务逻辑全部执行或者全部不执行,在开发中,事务是怎么控制的呢?

       方案一、使用hibernate的OpenSession()。这种方式需要在业务边界创建session,并将session作为参数传递到Dao层,以此来保证多个业务逻辑之间使用的是同一个session。

         添加用户的同时要完成addLog()和addUser()两个操作:

           1. LogManagerImpl类中的添加日志

          public void addLog(Log log,Session session){

                  session.save(log,session);

           }

           2. UserManagerImpl类中完成所有业务逻辑

  1. //openSession()创建session    
  2. SessionFactory factory= new Configuration().configure();  
  3.   
  4. Session session=factory.openSession();            
  5. //开启事务           
  6. session.beginTransaction();           
  7. //执行业务逻辑1. 保存user      
  8. session.save(user);                
  9. //Log和LogManagerImpl的创建由IoC控制                        
  10. log.setTime(new Date());      
  11. log.setType("操作日志");                
  12. //执行业务逻辑2. 保存log,同时传递session           
  13. logManager.addLog(log,session);                   
  14. session.getTransaction().commit();           
  15. //使用openSession,当最后一个业务逻辑完成后必须关闭session           
  16. session.close();  

 

  方法二、 使用Hibernate的getCurrentSession(),currentSession和openSession的区别在于,使用currentSession使用完毕后不用手动关闭session。currentSession相当于将session放到一个ThreadLocal中。

         1.  LogManagerImpl类

          pubic  void addLog(Log log){

                    //可以通过getCurrentSession()创建Session,不必使用传递的session

                   Session session= factory.getCurrentSession()

                   session.save(log);

            }

           2. UserManagerImpl类中完成所有业务逻辑      

  1.  //openSession()创建session        
  2. SessionFactory factory= new Configuration().configure();        
  3. Session session=factory.getCurrentSession();                
  4. //开启事务               
  5. session.beginTransaction();               
  6. //执行业务逻辑1. 保存user          
  7. session.save(user);                    
  8. //Log和LogManagerImpl的创建由IoC控制                            
  9. log.setTime(new Date());          
  10. log.setType("操作日志");                    
  11. //执行业务逻辑2. 保存log              
  12. logManager.addLog(log);                       
  13. session.getTransaction().commit();               
  14. //使用currentSession,当最后一个业务逻辑完成后不用关闭session              

        3. 使用currentSession,需要在hibernate.cfg.xml配置文件中开启事务

      <property name="hibernate.current_session_context_class">thread</property>

 

方案三、将hibernate和spring集成,使用spring框架的声明式事务。
       使用spring的声明式事务,不再需要自动创建sessionFactory和Session,不再需要手动控制事务的开启和关闭。

       使用spring声明式事务的几个步骤:

       1. applicationContext.xml中进行配置

  1. <!-- 配置事务管理器 -->      
  2. <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">          
  3.      <property name="sessionFactory">              
  4.           <ref bean="sessionFactory"/>  <!-- transactionManager的SetSessionFactory()方法的参数为SessionFactory -->                     </property>      
  5. </bean>          
  6.   
  7. <!-- 那些类那些方法使用事务 -->      
  8. <aop:config>          
  9.     <aop:pointcut id="allManagerMethod" expression="execution(* com.bjpowernode.usermgr.manager.*.*(..))"/>          
  10.     <aop:advisor pointcut-ref="allManagerMethod" advice-ref="txAdvice"/>      
  11. </aop:config>           
  12.      
  13.   
  14. <!-- 事务的传播特性 -->        
  15. <tx:advice id="txAdvice" transaction-manager="transactionManager">          
  16.     <tx:attributes>              
  17.         <tx:method name="add*" propagation="REQUIRED"/>              
  18.         <tx:method name="del*" propagation="REQUIRED"/>              
  19.         <tx:method name="modify*" propagation="REQUIRED"/>             
  20.         <tx:method name="*" propagation="REQUIRED" read-only="true"/>          
  21.     </tx:attributes>      
  22. </tx:advice>  
  1.  2.UserManagerImpl类继承HibernateDaoSupport  
  1. public class UserManagerImpl extends HibernateDaoSupport{     
  2.      public void addUser(User user)       
  3.      throws Exception {          
  4.      this.getHibernateTemplate().save(user);          
  5.      log.setType("操作日志");          
  6.      log.setTime(new Date());          
  7.      log.setDetail("XXX");                   
  8.      logManager.addLog(log);                   
  9.      throw new Exception();      


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值