spring中如何做事务?(最原始的做法 只供参考)

spring中如何做事务?(最原始的做法 只供参考)
之前说的都要实现接口,对Api的依赖性强 属于侵入式的
接下来讲下非侵入式的代码如何实现:

针对环绕事务处理 , 要指明 ProceedingJoinPoint 参数
ProceedingJoinPoint 相当于事件 , 此参数会带着触发该事件的源信息
obj = pjp.proceed() ;在这里等同于调用add*()方法中的代码(参考配置)
配置如下:
<bean id="hibernateUtil" class="com.cs.util.HibernateUtil" ></bean>
<bean id="teamDao" class="com.cs.dao.TeamDaoImpl">
<property name="hibernateUtil" ref="hibernateUtil" />
</bean>
<bean id="personDao" class="com.cs.dao.PersonDaoImpl">
<property name="hibernateUtil" ref="hibernateUtil" />
<property name="teamDao" ref="teamDao" />
</bean>
<bean id="logAdvice" class="com.cs.advice.LogAdvice" />
<bean id="transactionAspect" class="com.cs.advice.TransactionAspect"></bean>
<aop:config>
<aop:pointcut id="addMethod" expression="execution(* add*(..))" />
<aop:pointcut id="afterMethod" expression="execution(* update*(..))" />
<aop:aspect ref="logAdvice">
<aop:before pointcut-ref="addMethod" method="log" />
<aop:after pointcut-ref="afterMethod" method="afterLog" />

</aop:aspect>

<aop:aspect ref="transactionAspect">
<aop:around pointcut-ref="addMethod" method="invoke" />
//针对所有的add*方法都处理了事务(抓哟针对的是级联事务,session是如何传播的),也可以用这种方法做日志,
</aop:aspect>
</aop:config>
transactionAspect的代码如下:

public class TransactionAspect {
private HibernateUtil hibernateUtil ;
private int count = 0 ;
/** count 用于控制在父类对象开启的事务 在父类事务结束时关闭,
**如果不用count控制 , 则父类对象开启的事务会在子类对象的事务处理完毕后关闭
*原因:因为在spring中配置的bean 都是单例,请注意
*/

public HibernateUtil getHibernateUtil() {
return hibernateUtil;
}
public void setHibernateUtil(HibernateUtil hibernateUtil) {
this.hibernateUtil = hibernateUtil;
}
/**针对环绕事务处理 , 要指明 ProceedingJoinPoint 参数
* ProceedingJoinPoint 相当于事件 , 此参数会带着源信息
* obj = pjp.proceed() ;在这里等同于调用add*()方法中的代码(参考配置)
*/
public Object invoke(ProceedingJoinPoint pjp) throws Throwable {
Object obj = null ;
Session session = null ;
Transaction tx = null ;

try {
session = hibernateUtil.getSession() ;
tx = session.getTransaction() ;
count++ ;
if (!tx.isActive()){
System.out.println("事务开启" + pjp.getTarget().getClass().getName()) ;
tx.begin() ;
}

obj = pjp.proceed() ; // *****************关键代码*********************************
count-- ;
if (tx.isActive() && count <= 0){
tx.commit() ;
System.out.println("事务结束" + pjp.getTarget().getClass().getName()) ;
}
} catch (RuntimeException e) {
System.out.println(e.getMessage());
e.printStackTrace() ;
tx.rollback() ;
}finally{
return obj;
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值