Spring中的声明式事务
【摘要】 Spring中的声明式事务事务配置配置涉及3个方面数据源data source事务管理器transaction manager代理机制持久层不同,配置的变化如下JDBCHibernateJPA数据源DataSourceSessionFactoryEntityManager事务管理器DataSourceTransactionManagerHibernateTransactionManagerJpaT
Spring中的声明式事务
事务配置
配置涉及3个方面
数据源data source
事务管理器transaction manager
代理机制
持久层不同,配置的变化如下
JDBC | Hibernate | JPA | |
---|---|---|---|
数据源 | DataSource | SessionFactory | EntityManager |
事务管理器 | DataSourceTransactionManager | HibernateTransactionManager | JpaTransactionManager |
更多TransactionManager:
代理机制
在应用系统调用声明@Transactional 的目标方法时,Spring Framework 默认使用 AOP 代理,在代码运行时生成一个代理对象,根据@Transactional 的属性配置信息,这个代理对象决定该声明@Transactional 的目标方法是否由拦截器 TransactionInterceptor 来使用拦截,在 TransactionInterceptor 拦截时,会在在目标方法开始执行之前创建并加入事务,并执行目标方法的逻辑, 最后根据执行情况是否出现异常,利用抽象事务管理器AbstractPlatformTransactionManager 操作数据源 DataSource 提交或回滚事务。
Spring AOP 代理有 CglibAopProxy (通过继承被代理的类来代理)和 JdkDynamicAopProxy (通过实现被代理类的接口来代理)两种。
全注解的方式配置拦截器
使用全注解的方式配置拦截器,以拦截被@Transactional注解的方法。
<?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:context="http://www.springframework.org/schema/context"
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/context
http://www.springframework.org/schema/context/spring-context-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">
<context:annotation-config />
<context:component-scan base-package="com.bluesky" />
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation" value="classpath:hibernate.cfg.xml" />
<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
</bean>
<!-- 定义事务管理器(声明式的事务) -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
</beans>
@Transactional注解的使用
可以将@Transactional 注解添加到合适的方法上,也可以加到类上,此时该类所有的公共方法都配置了相同的事务属性信息。
Spring在TransactionDefinition接口中定义这些属性,以供PlatfromTransactionManager使用。PlatfromTransactionManager是spring事务管理的核心接口。
TransactionDefinition
public interface TransactionDefinition {
int getPropagationBehavior();
int getIsolationLevel();
int getTimeout();
boolean isReadOnly();
}
属性名 | 说明 |
---|---|
name | 当在配置文件中有多个 TransactionManager , 可以用该属性指定选择哪个事务管理器。 |
propagation | 事务的传播行为,默认值为 REQUIRED。 |
isolation | 事务的隔离度,默认值采用 DEFAULT。 |
timeout | 事务的超时时间,默认值为-1。如果超过该时间限制但事务还没有完成,则自动回滚事务。 |
read-only | 指定事务是否为只读事务,默认值为 false;为了忽略那些不需要事务的方法,比如读取数据,可以设置 read-only 为 true。 |
rollback-for | 用于指定能够触发事务回滚的异常类型,如果有多个异常类型需要指定,各类型之间可以通过逗号分隔。 |
no-rollback- for | 抛出 no-rollback-for 指定的异常类型,不回滚事务。 |
其中:
Isolation level,隔离级别
ISOLATION_DEFAULT ,使用数据库默认的隔离级别(默认选项)
ISOLATION_READ_UNCOMMITTED,未提交读
ISOLATION_READ_COMMITTED ,提交读
ISOLATION_REPEATABLE_READ,可重复读
ISOLATION_SERIALIZABLE,序列化
Propagation Behavior,传播性
REQUIRED的含义是,支持当前已经存在的事务,如果还没有事务,就创建一个新事务。(默认)
MANDATORY的含义是,支持当前已经存在的事务,如果还没有事务,就抛出一个异常。
NESTED的含义是,在当前事务中创建一个嵌套事务,如果还没有事务,那么就简单地创建一个新事务。
REQUIRES_NEW的含义是,挂起当前事务,创建一个新事务,如果还没有事务,就简单地创建一个新事务。
NOT_SUPPORTED的含义是,强制不在事务中运行,如果当前存在一个事务,则挂起该事务。
SUPPORTS的含义是,支持当前事务,如果没有事务那么就不在事务中运行。SUPPORTS传播性的逻辑含义比较模糊,因此一般是不推荐使用的。
参考
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)