Spring 手动实现aop管理事务


1.事务的使用:

每次对数据库操作我们都要beginTransaction,显然是不行的.

(比如一个业务中多次操作数据库,但是当某个方法出错或是..我们需要回滚,但是每次操作我们都提交了;整体回滚不了,

所以我们有些只能把它们绑定使用一个事务)


 2.手动实现aop管理事务:

利用aop around环绕拦截。拦截方法(service中的一个业务方法)之前开启事务,之后再关闭;

  1. package org.ymm.aops;  
  2.   
  3. import org.aspectj.lang.ProceedingJoinPoint;  
  4. import org.hibernate.SessionFactory;  
  5. import org.ymm.entity.Users;  
  6.   
  7. public class LoginAdvice {  
  8.       
  9.     public SessionFactory sf;  
  10.       
  11.     public SessionFactory getSf() {  
  12.         return sf;  
  13.     }  
  14.   
  15.     public void setSf(SessionFactory sf) {  
  16.         this.sf = sf;  
  17.     }  
  18.   
  19.     public Object around1(ProceedingJoinPoint pjp) throws Throwable{  
  20.         this.sf.getCurrentSession().beginTransaction();  
  21.         Object o = pjp.proceed();  
  22.         this.sf.getCurrentSession().getTransaction().commit();  
  23.         return o;  
  24.     }  
  25. }  

sf 是spring接管hibernate的SessionFactory

  1. <bean id="L_a" class="org.ymm.aops.LoginAdvice" >  
  2.         <property name="sf" ref="sFactory"></property>  
  3.      </bean>  
  4.               
  5.     <aop:config>  
  6.         <aop:pointcut expression="execution(* org.ymm.services.LoginService.Login(..))" id="lg"/>  
  7.       
  8.         <aop:aspect ref="L_a" id="my_la">  
  9.             <aop:around method="around1" pointcut-ref="lg"/>  
  10.         </aop:aspect>  
  11.     </aop:config>  

services中被切的方法

  1. package org.ymm.services;  
  2.   
  3. import org.ymm.dao.IUsersDao;  
  4. import org.ymm.entity.Users;  
  5.   
  6. public class LoginService implements ILoginService{  
  7.       
  8.     public IUsersDao ud;  
  9.       
  10.     public IUsersDao getUd() {  
  11.         return ud;  
  12.     }  
  13.   
  14.     public void setUd(IUsersDao ud) {  
  15.         this.ud = ud;  
  16.     }  
  17.   
  18.     public Users Login(String uname){  
  19.         ud.getAllUsers();//aop切面管理事务 只是为了测试两个查询都用同一个事务   
  20.         return ud.findUserByUname(uname);  
  21.     }  
  22. }  

方法中我们就不需开启事务

  1. public Users findUserByUname(String uname) {  
  2.         // TODO Auto-generated method stub   
  3.         Session session= sf.getCurrentSession();  
  4.         /*session.beginTransaction();*/  
  5.         List<Users> list= session.createSQLQuery("select u.*,1 from users  u where u.uname='"+uname+"'")  
  6.                 .addEntity(Users.class).list();  
  7.         Users user=(Users)(list.get(0));  
  8.         return user;  
  9.     }  

相关内容