第一种 原始的配置方法如下:
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager"
scope="singleton" lazy-init="default" autowire="default"
dependency-check="default">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<!-- 事务代理 -->
<bean id="baseTransaction" lazy-init="true" abstract="true"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref local="transactionManager" />
</property>
<property name="transactionAttributes">
<props>
<prop key="add*">PROPAGATION_REQUIRED</prop>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="modify*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="remove*">PROPAGATION_REQUIRED</prop>
<prop key="create*">PROPAGATION_REQUIRED</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="query*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="read*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
<!-- 设置强制使用CGLIB生成代理 -->
<property name="optimize" value="true" />
</bean>
<!-- 服务层bean配置方法 -->
<bean id="userService" parent="baseTransaction">
<property name="target">
<bean
class="com.maxjay.bank.service.impl.UserServiceImpl">
<property name="userDao">
<ref bean="userDao" />
</property>
</bean>
</property>
</bean>
第二种 使用tx/aop命名空间进行配置:
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager"
scope="singleton" lazy-init="default" autowire="default"
dependency-check="default">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<aop:config>
<aop:pointcut id="serviceMethod"
expression="execution(* com.maxjay.bank.service.impl.*Impl.*(..))" />
<aop:advisor pointcut-ref="userService" advice-ref="txAdvice" />
</aop:config>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="add*"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<bean id="userService" class="com.maxjay.bank.service.impl.UserServiceImpl">
<property name="userDao">
<ref bean="userDao" />
</property>
</bean>
上面两种方法中的UserServiceImpl类都是普通的服务层类,没有加入任何的注解。
第三种 使用注解配置声明式事务。使用此方法必须在service类中添加相应的注解,例子如下:
package com.maxjay.bank.service.impl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.maxjay.bank.dao.GoodDao;
import com.maxjay.bank.model.TImage;
import com.maxjay.bank.service.GoodService;
@Service("goodService")
// @Transactional可以使用在类和方法上,其默认的事务传播行为是REQUIRED,隔离级别为ISOLATION_DEFAULT,读写事务属性为读/写事务
// 该注解的属性有 propagation:事务传播行为;isolation:事务隔离级别,可以通过Isolation枚举类来设置;
// readOnly:事务读写性;timeout:超时时间,int型,单位秒;
// rollbackFor:定义需要进行回滚的异常类,如@Transactional(rollBackForClassName={SQLException.class,..});
// noRollBackFor:定义遇到时不回滚的类
@Transactional(propagation=Propagation.REQUIRED)
public class GoodServiceImpl implements GoodService {
private GoodDao goodDao;
public void saveGoodImage(TImage image) {
goodDao.saveGoodImage(image);
}
public void updateGoodImage(TImage image) {
goodDao.update(image);
}
@Transactional(readOnly=true)
public void getGoodImange(int id){
goodDao.getObject(TImage.class, id);
}
}
为了使加入的@Transactional起作用,还需要在spring配置文件中加入下面这段
<!-- 对标注了@Transactional注解的bean进行加工,织入事务管理切面 -->
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
<!-- 加入了此配置,spring就会自动装载那些使用了service等注解的bean,并为其设置属性 -->
<context:component-scan base-package="com.maxjay.bank.service"/>
在使用spring注解声明事务时,经常会出现子类与父类的事务继承困惑,根据使用经验结果如下:
是否可继承父类事务注解
类注解 是
子类实现父类方法 否
子类重写父类方法 否
子类继承父类方法 是
特别注意的是类方法内部的相互调用是不会经过spring代理对象的,也就是没有经过spring做事务增强,当方法中只存在于本类方法调用且需要事务时必须在方法上加入事务注解才可以。
分享到:
相关推荐
Spring事务管理的目的是确保数据的一致性和完整性,尤其是在多操作、多资源的环境中。本Demo将深入探讨Spring如何实现事务的管理。 首先,Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。 ...
如果未回滚,可能是因为事务管理配置有误,或者事务管理被错误地关闭了。 为了彻底解决问题,首先检查事务管理的配置文件,确认`<tx:annotation-driven>`元素已经正确配置,同时检查数据库连接池配置,确保事务管理...
本资源包提供了进行Spring事务管理开发所需的所有关键库,包括框架基础、核心组件、AOP(面向切面编程)支持、日志处理、编译工具以及与数据库交互的相关jar包。下面将对这些知识点进行详细解释: 1. **Spring框架*...
Spring 3.0 事务管理配置 Spring 3.0 提供了两种事务管理配置方法:基于 XML 的事务管理和基于 @Transactional 的事务管理,这两种方法都是为了实现事务管理的目标,分别具有不同的配置方式和优缺点。 基于 XML ...
本篇将深入探讨Spring事务管理的核心概念、工作原理以及如何使用`spring-tx-3.2.0.RELEASE.jar`这个jar包。 首先,我们需要理解什么是事务。在数据库系统中,事务是一组操作,这些操作被视为一个整体,要么全部完成...
Spring 框架是Java开发中...理解并熟练掌握Spring事务管理,对于提升应用程序的稳定性和可靠性至关重要。在实际开发中,结合声明式事务管理、事务传播行为、隔离级别和回滚规则,可以有效地确保数据的完整性和一致性。
总结来说,Spring事务管理失效的原因是多方面的,涵盖从代理模式原理到AOP的实现细节,再到异常处理机制,以及事务传播和隔离级别的配置等多个层面。开发者需要深入理解Spring框架的内部机制,才能在实际开发中有效...
### Spring事务管理详解 #### 一、Spring事务管理概述 Spring框架提供了强大的事务管理功能,使得开发者能够更方便地管理应用程序中的事务。Spring事务管理主要包括两种类型:编程式事务管理和声明式事务管理。 -...
本篇文章将深入探讨Spring事务管理的五种方法,旨在帮助开发者更好地理解和运用这一核心特性。 首先,我们来了解什么是事务。在数据库操作中,事务是一组逻辑操作,这些操作要么全部成功,要么全部失败,确保数据的...
实验 "Spring 声明事务" 是 Java 高级编程中的一个重要环节,旨在让学生掌握 Spring 框架中声明式事务管理的配置和使用。在实际应用中,事务管理是确保数据一致性、完整性和可靠性的关键组件。Spring 提供了声明式...
首先,Spring事务管理的核心概念是ACID(原子性、一致性、隔离性和持久性),这是所有事务系统的基础。在Spring中,事务管理分为两种模式:声明式事务管理和编程式事务管理。声明式事务管理通过配置元数据(如XML或...
在Spring框架中,事务管理是核心功能之一,它确保了数据操作的一致性和完整性。本教程将深入探讨如何在Spring中实现自定义事务管理器...这将加深你对Spring事务管理的理解,帮助你在实际项目中更加熟练地运用这些技术。
Spring事务管理创造性的解决了很多以前要用重量级的应用服务器才能解决的事务问题,那么其实现原理一定很深奥吧?可是如果读者仔细研究了Spring事务管理的代码以后就会发现,事务管理其实也是如此简单的事情。这也...
- **配置事务管理器**:接下来,需要配置一个事务管理器(如`DataSourceTransactionManager`),它负责管理事务的开始、提交和回滚。 - **配置事务规则**:最后,需要配置事务规则,指定哪些方法需要在事务中执行。 ...
spring的事务管理配置详解.txt详细的描述了如何配置spring的事物。
1. **基于XML的全局事务配置**:这种方式通过在Spring配置文件中设置`<tx:advice>`和`<aop:config>`元素来实现事务管理。相比于第一种方式,这种方式更加简洁,适用于所有业务逻辑Bean。 2. **基于注解的事务配置**...
在本文中,我们将深入探讨Spring框架中的事务管理。Spring是一个广泛应用的Java企业级应用开发框架,它提供...如果你想要深入了解,可以参考提供的博客链接或其他相关资料,进一步学习Spring事务管理的细节和最佳实践。
Spring事务管理就是围绕这些特性来确保数据的一致性。 四、事务的传播行为 在Spring中,我们可以配置事务的传播行为,比如REQUIRED(默认,如果当前存在事务,则加入当前事务,否则新建一个事务)、PROPAGATION_...
你可以创建一个简单的 Spring 应用,配置事务管理器,并在业务层使用 @Transactional 注解或 TransactionTemplate 进行事务控制,以加深理解和应用。 总的来说,Spring 的事务管理机制提供了强大而灵活的支持,无论...