spring事务管理
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代码
<?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>
<!-- 配置哪些类的方法需要进行事务管理 最好不要设置到dao层 ,可以设置到 业务层--> 包名称 能模糊
<!-- 返回值 包名字 类名字 方法名字(参数情况) * com.company.*.*(..) 表示所有的返回值 com.company包 下的所有的类 所有的方法 方法的参数不限-->
<!-- 第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>
事务管理器一共有5种:
DataSourceTransactionManager JDBC事务管理器
HibernateTransactionManager Hibernate事务管理器
JdoTransactionManager JDO事务管理器
JtaTransactionManager JTA事务管理器
PersistenceBrokerTransactionManager Apache的OJB事务管理器
2>.基于注解方式
第1步:在spring配置文件中启用对AspectJ注解的支持
Xml代码
<?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;
}
}
Java代码
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;
}
}
<!-- 配置哪些类的方法需要进行事务管理 最好不要设置到dao层 ,可以设置到 业务层--> 包名称 能模糊
<!-- 返回值 包名字 类名字 方法名字(参数情况) * com.company.*.*(..) 表示所有的返回值 com.company包 下的所有的类 所有的方法 方法的参数不限-->
资料来自网站:http://z-xiaofei168.iteye.com/blog/1044843
相关推荐
### SAP配置传输教程知识点详解 #### 一、概述 SAP配置传输是SAP系统管理中的一个重要组成部分,它主要用于...通过学习和实践这些工具和技术,可以有效地提高在SAP项目中的配置效率和质量,对于项目的成功至关重要。
在描述中提到,这是一个能够成功运行的例子,这意味着它应该包含了一个简单的Spring配置文件和一个主方法,用于测试事务的处理。在Spring中,通常会使用`@Transactional`注解来声明一个方法需要在事务中执行。这个...
以上介绍了SAP CO模块中成本要素、成本中心和利润中心相关的配置点,包括它们的基本概念、作用、事务代码及配置步骤等。通过这些配置,用户可以有效地管理和监控企业内的成本流动情况,实现精细化的成本控制。接下来...
你可以为每个数据源设置一个事务管理器,并在需要事务控制的方法上添加该注解。如果配置了多个数据源,需要确保正确地指定事务管理器,以避免事务范围的混淆。 3. **自定义URL拦截过滤器**: 使用Spring MVC的`...
4. **MyBatis框架**:MyBatis的主配置文件是`mybatis-config.xml`,包含了数据源、事务管理器等信息。每个Mapper接口对应一个`mapper.xml`文件,描述SQL语句和结果映射。 5. **Spring Boot框架**:Spring Boot简化...
1. **SAP ECC6 系统**:确保您的SAP环境版本为ECC6。 2. **Windows XP操作系统**:虽然这不是必须的,但在本例中,作者使用的是Windows XP作为操作系统。 3. **工作流环境配置**:在执行具体的工作流配置前,需通过...
SAP后台配置是SAP系统实施和日常管理中非常重要的一个环节,它涵盖了从基本的系统设置到复杂业务流程配置的方方面面。...这不仅对于掌握SAP系统的原理至关重要,也为日后深入学习SAP的各个模块打下了坚实的基础。
1. **配置**:MySQL的配置文件通常为`my.cnf`,它定义了服务器的启动参数和各种设置。配置项如`innodb_buffer_pool_size`(InnoDB存储引擎的缓冲池大小)、`max_connections`(最大连接数)和`thread_cache_size`...
- 选择启用镜像,查看状态显示为已配置好的镜像状态。 12. **检查数据库状态**: - 检查数据库状态,确保镜像正常工作。 #### 四、排错指南 在配置过程中可能会遇到各种问题,例如错误代码1418,这通常意味着...
首先,数据库的存储结构由三部分组成:主文件、事务日志和次要文件。主文件包含了数据库的启动信息和数据信息,它是数据库中唯一不可替代的部分。事务日志则存储所有用于恢复数据库操作的记录,确保数据的一致性和...
FTP服务器的配置与管理是计算机网络及应用领域中的一个重要实践环节。FTP,全称为File Transfer Protocol,文件传输协议,是互联网上广泛使用的用于在不同主机...同时,这也为更深入学习其他网络协议和服务奠定了基础。
SAP基础知识学习,批处理,常用事务代码,权限管理等 SAP基础知识学习是指学习SAP系统的基本概念和操作步骤,包括创建逻辑系统、创建CLIENT、LOCALE CLIENT COPY、Batch Input、常用事务代码、权限管理等。 创建...
后台配置主要包括:供应商主数据、物料主数据、采购组织和库存地点设定、采购订单和收货处理流程等。对于制造业企业来说,MM模块的配置直接影响到供应链的顺畅运行。 再来看PP模块,它是生产导向型企业必备的功能,...
此外,文档还引导用户通过创建第一个Puppet配置和第一个Puppet模块的示例,学习如何应用配置。文档还介绍了PuppetDashboard控制台的安装、配置、运行以及如何与Puppet集成,包括节点实施报告汇总和外部节点分类器的...
Go-TaaS,全称为Go-Transaction-as-a-Service,是一个专为分布式事务处理设计的高可用服务端解决方案,它与Seata保持兼容性。Seata(Simple Extensible Autonomous Transaction Architecture)是一个开源的分布式...
比如,配置物料主数据时,可能需要使用事务代码MM01;而进行销售订单处理,则可能使用SD模块的事务代码VA01。 SAP配置还包括定义组织结构,如公司代码、工厂、存储地点等,这些是企业运营的基础框架。配置时需确保...
Redis是一款高性能的键值对数据库,常用于缓存、消息队列等场景。本文将详细介绍Redis的...随着对Redis的深入学习,你将发现更多高级特性和用法,如Lua脚本、发布订阅、事务等,这些都能极大地提升你的应用程序性能。