spring事务管理
author:z_xiaofei168
6.1、spring的事务管理器
Spring框架并没有直接管理用户的应用系统中的事务,它只是提供许多供用户选择的事务管理器,然后将事务管理的责任委托给与此事务管理器对应的持久化技术的事务实现。
事务管理实现
|
使用时机
|
org.springframework.jdbc.datasource.
DataSourceTransactionManager
|
在单一的JDBC DataSource中管理事务
|
org.springframework.orm.hibernate3.
HibernateTransactionManager
|
当持久化机制是Hibernate时,用它来管理职务
|
org.springframework.orm.
jpa.JpaTransactionManager
|
当JPA用作持久化时,用它来管理职务
|
org.springframework.transaction.
jta.JtaTransactionManager
|
使用一个JTA实现来管理事务。在一个事务跨越多个资源时必须使用
|
配置文件中的配置如下:
<bean id=”transactionManager” class=” org.springframework.jdbc.datasource. DataSourceTransactionManager”>
<property name=”dataSource” ref=” dataSource”/>
</bean>
6.2、事务属性介绍
1>.传播行为
传播行为
|
说明
|
PROPAGATION_REQUIRED
|
必须在一个事务中执行。如果当前有一个事务正在进行,该方法将会在那个事务中执行。否则要开始一个新事务。Spring事务传播行为的默认值。
|
PROPAGATION_SUPPORTS
|
支持现有的事务。如果当前没有事务在进行,就以非事务的方式执行
|
PROPAGATION_MANDATORY
|
方法必须在一个现有事务中进行,否则会抛出异常。
|
PROPAGATION_REQUIRES_NEW
|
必须在它自己的新启事务里进行。如果现有事务在进行就先暂停它
|
PROPAGATION_NOT_SUPPORTED
|
不应在事务中进行。如果现有事务在进行就先暂停它
|
PROPAGATION_NEVER
|
不应在事务中进行。如果现有事务在进行就抛出异常
|
PROPAGATION_NESTED
|
如果现有事务正在进行,则该方法运行在一个嵌套式事务中。否则PROPAGATION_REQUIRED执行
|
2>.隔离级别
隔离级别
|
说明
|
ISOLATION_DEFAULT
|
使用底层数据库默认的隔离级别spring事务隔离级别的默认值
|
ISOLATION_READ_UNCOMMITED
|
充许另一个事务可以读到这个事务未提交的数据可能导致脏读、不可重复读和幻读。
|
ISOLATION_READ_COMMITED
|
保证一个事务修改的数据提交后才能被另一个事务读取可能导致不可重复读和幻读。
|
ISOLATION_REPEATABLE_READ
|
要求对相同字段的多次读取的结果必须相同,除非事务本身更新了数据可能导致幻读。
|
ISOLATION_SERIALIZABLE
|
事务被处理为顺序执行可以防止脏读、不可重复读、幻读。
|
3>.只读提示
如果事务只对后端数据进行读操作,则后端数据库可以采用一些优化措施来提高执行效率。但必须在事务中才有效。也就是说要搭配传播行为PROPAGATION_REQUIRED,PROPAGATION_REQUIRES_NEW,PROPAGATION_NESTED 来设置。
4>.事务超时间隔
还可以设置事务的超时间隔,让事务在特定秒数后自动回滚,不必等它自己结束。由于计时是从事事务开始时算起的,所以它也得搭配传播行为为 PROPAGATION_REQUIRED,PROPAGATION_REQUIRES_NEW,PROPAGATION_NESTED 来设置。
5>.回滚规则
当事务运行过程中抛出异常时,事务可以被声明为回滚或者不回滚。默认情况下只在出现RuntimeExceptio才会回滚,而在出现受检异常时不回滚。
当然,也可以改变这种回滚规则,可以声明一个事务在出现特定的受检异常时能回滚。也可以声明一个事务在出现特定的非受检异常时不回滚。
6.3、声明式事务管理
1>.基于xml配置方式
第1步:定义事务通知
第2部:把事务通知绑定到切入点
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<!-- 配置不带连接池的数据源 -->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql:///spring" />
<property name="username" value="root" />
<property name="password" value="123" />
</bean>
<!-- JDBC事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- DataSource事务管理器需要数据源实例 -->
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 第1步:定义事务通知(主要是针对指定事务管理器对应的事务实现配置事务参数) -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 对选定的方法配置详细的事务属性 -->
<tx:method name="find*" read-only="true" />
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!-- 第2步:AOP配置 -->
<aop:config>
<!-- 声明事务切入点(配置哪些类的哪些方法参与事务) -->
<aop:pointcut id="AllServiceMethod"
expression="execution(* com.zxf.service.*.*(..))" />
<!-- 通知器(把事务通知绑定到切入点) -->
<aop:advisor pointcut-ref="AllServiceMethod" advice-ref="txAdvice" />
</aop:config>
<!-- 以下是Spring容器管理的Bean -->
<bean id="accountDao" class="com.zxf.dao.AccountDaoJDBCImpl">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="accountService" class="com.zxf.service.AccountService">
<property name="accountDao" ref="accountDao"/>
</bean>
<!-- Hibernate事务管理器
<bean id="txManager2"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref ="sessionFactory"/>
</bean>
-->
<!-- JPA事务管理器
<bean id="txManager3"
class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref ="entityManagerFactory"/>
</bean>
-->
</beans>
2>.基于注解方式
第1步:在spring配置文件中启用对AspectJ注解的支持
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<!-- 配置不带连接池的数据源 -->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql:///spring_04" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
<!-- JDBC事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!-- DataSource事务管理器需要数据源实例 -->
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 启用对事务注解的支持 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!-- 以下是Spring容器管理的Bean -->
<bean id="accountDao" class="com.zxf.dao.AccountDaoJDBCImpl">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="accountServiceByTxAnnotation"
class="com.zxf.service.AccountServiceByTxAnnotation">
<property name="accountDao" ref="accountDao"/>
</bean>
</beans>
第2步:用@Transactional注解指定接口、类或方法的事务属性
package com.zxf.service;
import java.util.List;
import org.springframework.transaction.annotation.Transactional;
import com.zxf.dao.AccountDao;
import com.zxf.domain.Account;
/** Account业务逻辑类--基于注解方式的声明式事务管理配置 */
@Transactional //指定需要声明式事务,事务属性使用默认值
public class AccountServiceByTxAnnotation {
private AccountDao accountDao;
public void setAccountDao(AccountDao accountDao){
this.accountDao = accountDao;
}
}
分享到:
相关推荐
标题 "开源框架spring详解-----AOP的深刻理解" 指向的是对Spring框架中核心概念之一的面向切面编程(Aspect Oriented Programming, AOP)的深入探讨。AOP是Spring用来解决横切关注点问题的一种编程模式,它允许...
Spring 提供了强大的事务管理功能,可以在配置文件中声明事务边界,或者通过编程方式控制事务。这使得开发者能够轻松地管理事务,确保数据的一致性和完整性。 4. **JdbcTemplate 和 NamedParameterJdbcTemplate** ...
4. **数据访问/集成**:Spring对JDBC、ORM框架(如Hibernate、MyBatis)以及NoSQL数据库的支持进一步增强,提供了事务管理功能,确保数据一致性。 5. **Spring Boot**:虽然Spring Boot不是4.3.9.RELEASE的一部分,...
Spring是一个开源的应用框架,它提供了一个全面的编程模型,旨在简化Java应用程序的开发过程。Spring的核心功能包括依赖注入(Dependency Injection, DI)、面向切面编程(Aspect Oriented Programming, AOP)、事务...
《Spring 框架详解:以 Spring TX 4.2.4.RELEASE 为例》 在软件开发领域,Spring 框架无疑是 Java 平台上最受欢迎的开源项目之一。其强大的功能、灵活的设计以及丰富的生态使得它成为企业级应用开发的首选。本文将...
Spring框架作为Java领域中最受欢迎的轻量级开源框架之一,其3.0版本的发布标志着一个重要的里程碑。本文将深入探讨Spring框架3.0的核心特性、主要改进以及如何使用其中的jar包。 一、Spring框架概述 Spring框架以...
- **定义**: Spring是一个开源框架,旨在简化企业级应用的开发。 - **功能定位**: 既可以被视为一个容器(负责管理对象的生命周期),也可以被视为一个框架(提供基础设施支持)。 - **特点**: 轻量级、非侵入式。 -...
《Spring Boot集成MyBatis详解》 在Java开发领域,Spring Boot以其简洁的配置和快速的应用启动特性,已经成为主流的微服务框架。而MyBatis作为一款轻量级的持久层框架,以其灵活的SQL映射和强大的实体与数据库交互...
《Spring与MyBatis整合详解及资源包下载指南》 在Java开发领域,Spring框架以其强大的功能和灵活性,成为企业级应用开发的首选。而MyBatis作为一个优秀的持久层框架,以其简洁高效的SQL操作和对象关系映射能力,...
Spring是一个开源的企业级应用框架,它提供了全面的编程和配置模型,包括依赖注入(DI)、面向切面编程(AOP)以及丰富的MVC支持。而MyBatis则是一个轻量级的ORM框架,它简化了SQL操作,允许开发者直接编写SQL语句,...
《Spring框架2.5.5依赖包详解及应用探索》 Spring Framework作为Java开发领域中的一个里程碑,一直以来都是企业级应用开发的首选框架。本文将深入探讨Spring 2.5.5版本及其依赖包,旨在为开发者提供全面的了解和...
Spring 是一个开源的 Java 开发框架,主要用于简化企业级应用的开发工作。它通过提供一系列的基础框架,使得开发者能够更容易地处理复杂的业务逻辑,并且提高了代码的可维护性和可测试性。Spring 提供了多种不同的 ...
Spring是一个开源的Java平台,它提供了一个全面的企业级应用开发框架,包括依赖注入、面向切面编程(AOP)、事务管理等功能。其核心设计理念是通过IoC(控制反转)和DI(依赖注入)简化对象的创建和管理,使得代码...
### SSH—Spring详解 #### Spring框架概述 Spring框架是一款轻量级开源框架,专注于解决业务逻辑层和其他层次之间的松耦合问题。它采用面向接口的编程思想,贯穿整个应用程序,从而提高了系统的灵活性和可维护性。...
### Spring Framework核心知识点详解 #### 一、Spring框架概述 **Spring Framework** 是一个开源的Java...通过对这些核心知识点的学习,开发者能够更好地理解和利用Spring框架的各种特性,提高开发效率和软件质量。
Spring框架作为Java领域最广泛应用的轻量级开源框架,以其模块化、松耦合的设计理念,为开发者提供了强大的企业级应用开发能力。本压缩包"spring-xx.zip"包含了Spring框架的核心组件,包括spring-jdbc、spring-aop、...
《Spring 框架 3.1.3 版本详解》 在IT领域,Spring框架作为Java开发的基石,其重要性不言而喻。本文将深入探讨Spring框架3.1.3版本的核心组件与功能,以帮助开发者更好地理解和应用这一强大的框架。 Spring框架是...
Spring框架作为Java领域最广泛使用的轻量级开源框架,以其模块化、松耦合的设计理念赢得了广大开发者的青睐。在提供的压缩包中,包含了Spring框架4.3.9版本的核心组件,以及一个依赖库——Apache Commons Logging ...
在Java开发领域,Spring框架和MyBatis作为两个极为流行的开源项目,被广泛应用于构建企业级应用。Spring以其强大的依赖注入和面向切面编程能力,为开发者提供了便捷的组件管理和事务控制;而MyBatis则以其灵活的SQL...
Spring是一个开源的企业级Java应用框架,由Rod Johnson创建,旨在简化企业级应用开发。它提供了控制反转(IoC)和面向切面编程(AOP),使得开发者可以将注意力集中在业务逻辑上,而不是繁琐的依赖管理和事务处理。...