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;
}
}
}
分享到:
相关推荐
Spring事务管理Demo
Spring中事务的传播属性详解,Spring中事务的传播属性详解
Spring 声明式事务和Spring 编程式事务
spring事务与数据库操作
spring framework 中文参考手册
spring学习事务源码spring学习事务源码spring学习事务源码spring学习事务源码spring学习事务源码spring学习事务源码spring学习事务源码spring学习事务源码
spring 事务spring 事务spring 事务spring 事务spring 事务
Java高级编程 实验报告 spring 声明事务 实验目的 掌握spring 声明式事务管理配置 实验环境 本实验采用本实验采用的eclipse或者 Myeclpse开发工具。Spring 4.0以上 Jdk1.7以上、oracle/mysql。
Spring事务传播机制可以通过Propagation枚举类中的不同值来指定,共包括七种不同的传播行为。具体来说,Spring事务传播机制包括以下七种: REQUIRED:如果当前没有事务,则创建一个新的事务;如果当前已经存在事务,...
很好的spring+ibatis事务的配置文档.
可以在spring中对整个项目的事务进行控制
javaEE 实验三 Spring JDBC与事务管理, 一、实验目的 1、掌握Spring JDBC的配置; 2、掌握JdbcTemplae类中增删改查方法的使用; 3、了解Spring事务管理的3个核心接口; 4、了解Spring事务管理的两种方式; 5、掌握...
spring boot 纯注解方法事务控制回滚,注解+简单配置文件使用多线程demo
Spring的事务框架将开发过程中事务管理相关的关注点进行适当的分离,并对这些关注点进行合 理的抽象,最终打造了一套使用方便,却功能强大的事务管理“利器”。通过Spring的事务框架,我 们可以按照统一的编程模型来...
本代码使用H2内存数据库演示spring事务使用,包括编程式事务,声明式事务@Transactional使用,自定义事务事务注解实现自定义事务管理器
Spring事务流程图时序图Spring事务流程图时序图Spring事务流程图时序图Spring事务流程图时序图
spring声明事务的配置 spring声明事务的配置 spring声明事务的配置
需要使用Spring切面,同时需要保证事务正常。可使用文档中的方法。一般情况,若不做特殊处理。使用切面,事务将会失效。
Spring事务操作示例(四种方式),包含完整代码和数据库文件(基于MySQL,在项目sql文件夹中),可运行,学习Spring事务详见博客:http://blog.csdn.net/daijin888888/article/details/51822257