spring 手动实现aop管理事务

jopen 12年前

1.事务的使用:

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

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

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

 

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

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

package org.ymm.aops;    import org.aspectj.lang.ProceedingJoinPoint;  import org.hibernate.SessionFactory;  import org.ymm.entity.Users;    public class LoginAdvice {      public SessionFactory sf;      public SessionFactory getSf() {    return sf;   }     public void setSf(SessionFactory sf) {    this.sf = sf;   }     public Object around1(ProceedingJoinPoint pjp) throws Throwable{    this.sf.getCurrentSession().beginTransaction();    Object o = pjp.proceed();    this.sf.getCurrentSession().getTransaction().commit();    return o;   }  }

sf 是spring接管hibernate的SessionFactory

<bean id="L_a" class="org.ymm.aops.LoginAdvice" >    <property name="sf" ref="sFactory"></property>    </bean>                    <aop:config>    <aop:pointcut expression="execution(* org.ymm.services.LoginService.Login(..))" id="lg"/>       <aop:aspect ref="L_a" id="my_la">     <aop:around method="around1" pointcut-ref="lg"/>    </aop:aspect>   </aop:config>

services中被切的方法

package org.ymm.services;    import org.ymm.dao.IUsersDao;  import org.ymm.entity.Users;    public class LoginService implements ILoginService{      public IUsersDao ud;      public IUsersDao getUd() {    return ud;   }     public void setUd(IUsersDao ud) {    this.ud = ud;   }     public Users Login(String uname){    ud.getAllUsers();//aop切面管理事务 只是为了测试两个查询都用同一个事务    return ud.findUserByUname(uname);   }  }


 

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

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