一、要弄清spring是如何进行事务管理的,首先来看两个接口:
1. TransactionDefinition 它包含了一些事务属性的定义(传播类型等)
public interface TransactionDefinition {
//....省略部分代码
//定义了7种事务的传播类型
int PROPAGATION_REQUIRED = 0;
int PROPAGATION_SUPPORTS = 1;
int PROPAGATION_MANDATORY = 2;
int PROPAGATION_REQUIRES_NEW = 3;
int PROPAGATION_NOT_SUPPORTED = 4;
int PROPAGATION_NEVER = 5;
int PROPAGATION_NESTED = 6;
//获取事务的传播类型
int getPropagationBehavior();
}
2. PlatformTransactionManager 事务管理器接口;真正的事务管理就是由这个接口的实现类来完成的。
public interface PlatformTransactionManager {
//通过事务的定义,来获取一个事务的当前状态
TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;
// 依照事务的状态来完成提交
void commit(TransactionStatus status) throws TransactionException;
// 回滚
void rollback(TransactionStatus status) throws TransactionException;
}
二、事务管理的实现
- spring 的事务管理分为两种方式:编程式和声明式;
<1> 编程式:使用硬编码的方式来完成事务操作。在sping里面,又有两种方式来完成编程式事务:
a.使用 PlatformTransactionManager 接口
DefaultTransactionDefinition dtd = new DefaultTransactionDefinition();//创建事务
dtd.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);//设置事务传播类别
TransactionStatus ts = transactionManager.getTransaction(dtd);//获取事务状态
try{
userStepMappingDao.add(us);//保存对象US
stepCategoryDao.add(usd);//保存对象USD
transactionManager.commit(ts);//提交
}catch(Exception e){
transactionManager.rollback(ts);//回滚
}
b.使用TransactionTemplate;看一下源码
public class TransactionTemplate extends DefaultTransactionDefinition
implements TransactionOperations, InitializingBean {
//可以看到, TransactionTemplate继承自DefaultTransactionDefinition
//内部还是使用了PlatformTransactionManager接口
private PlatformTransactionManager transactionManager;
//看一下主要的方法:
public <T> T execute(TransactionCallback<T> action)
throws TransactionException {
// 如果当前的事务管理器实现了CallbackPreferringPlatformTransactionManager接口
// ,则直接调查用接口的execute方法,这部分我们以后再看
if (this.transactionManager instanceof CallbackPreferringPlatformTransactionManager) {
return ((CallbackPreferringPlatformTransactionManager) this.transactionManager)
.execute(this, action);
} else {
// 由于继承自 DefaultTransactionDefinition,直接获取事务状态
TransactionStatus status = this.transactionManager
.getTransaction(this);
T result;
try {
// 这里action.doInTransaction(status);是我们自己的应用代码
// (这里考虑是否通过反射来调用DAO里面的方法)
result = action.doInTransaction(status);
} catch (RuntimeException ex) {
// Transactional code threw application exception -> rollback
// point A:
rollbackOnException(status, ex);
throw ex;
} catch (Error err) {
// Transactional code threw error -> rollback
// point B:
rollbackOnException(status, err);
throw err;
} catch (Exception ex) {
// Transactional code threw unexpected exception -> rollback
// point C:
rollbackOnException(status, ex);
throw new UndeclaredThrowableException(ex,
"TransactionCallback threw undeclared checked exception");
}
// 提交
this.transactionManager.commit(status);
return result;
}
}
可以看到,最终还是调用ransactionManager的rollback()方法。所以TransactionTemplate只是对PlatformTransactionManager作了一个内部调用而已。
<2>声明式:这也是最常用的方法,因这这种方法不会发生任何的代码侵入;
a. 使用org.springframework.transaction.interceptor.TransactionProxyFactoryBean进行手动代理
<bean id="baseTxProxy" abstract="true"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" /> //注入事务管理器
</property>
<!-- 这里通过target属性为某个接口加上事务,通过方法名来匹配 -->
<property name="target">
<ref bean="testTran" />//需要加事务的service
</property>
<property name="transactionAttributes">
<props>
<prop key="add*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="remove*">PROPAGATION_REQUIRED</prop>
<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
b.使用sping AOP
<tx:annotation-driven transaction-manager="transactionManager" /> //配置事务管理器
<tx:advice id="defaultTxAdvice" transaction-manager="transactionManager"> //事务属性
<tx:attributes>
<tx:method name="*Transaction" propagation="REQUIRED" //propagation 事务传播类型
rollback-for="Exception" />//所有exception回滚,相对的还有no-rollback-for属性
<tx:method name="find*" propagation="SUPPORTS" read-only="true" />//read-only="true"事务只读
<tx:method name="get*" propagation="SUPPORTS" read-only="true" />
<tx:method name="fetch*" propagation="SUPPORTS" read-only="true" />
<tx:method name="is*" propagation="SUPPORTS" read-only="true" />
<tx:method name="*_noTrans" propagation="NOT_SUPPORTED" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="allManagerMethod" //切点
expression=" (
execution(* com.managerment.service.impl..*.*(..)) //第一个*与包路径之间有空格
//第一个* :任何返回类型 第二个* :impl下所有的类 第三个*: 所有的方法 第一个.. (即impl..) :impl下的所有子包 第二个.. (即(..)):所有参数
) " />
<aop:advisor advice-ref="defaultTxAdvice" pointcut-ref="allManagerMethod" />//通知
</aop:config>
分享到:
相关推荐
Spring事务管理的目的是确保数据的一致性和完整性,尤其是在多操作、多资源的环境中。本Demo将深入探讨Spring如何实现事务的管理。 首先,Spring提供了两种主要的事务管理方式:编程式事务管理和声明式事务管理。 ...
本资源包提供了进行Spring事务管理开发所需的所有关键库,包括框架基础、核心组件、AOP(面向切面编程)支持、日志处理、编译工具以及与数据库交互的相关jar包。下面将对这些知识点进行详细解释: 1. **Spring框架*...
Spring 框架是Java开发中...理解并熟练掌握Spring事务管理,对于提升应用程序的稳定性和可靠性至关重要。在实际开发中,结合声明式事务管理、事务传播行为、隔离级别和回滚规则,可以有效地确保数据的完整性和一致性。
Spring事务管理.pdf 1.资料 2.本地事务与分布式事务 3.编程式模型 4.宣告式模型
Synchronized锁在Spring事务管理下,导致线程不安全。
本篇将深入探讨Spring事务管理的核心概念、工作原理以及如何使用`spring-tx-3.2.0.RELEASE.jar`这个jar包。 首先,我们需要理解什么是事务。在数据库系统中,事务是一组操作,这些操作被视为一个整体,要么全部完成...
标题“Spring事务管理失效原因汇总”指出了本文的核心内容是分析在使用Spring框架进行事务管理时可能遇到的问题及其原因。描述部分进一步说明了事务失效的后果往往不明显,容易在测试环节被忽略,但在生产环境中出现...
本篇文章将深入探讨Spring事务管理的五种方法,旨在帮助开发者更好地理解和运用这一核心特性。 首先,我们来了解什么是事务。在数据库操作中,事务是一组逻辑操作,这些操作要么全部成功,要么全部失败,确保数据的...
本文将详细介绍Spring事务管理的四种方式:编程式事务管理、声明式事务管理、PlatformTransactionManager接口以及TransactionTemplate。 1. **编程式事务管理**:这是一种手动控制事务的方式,通过在代码中调用`...
### Spring事务管理详解 #### 一、Spring事务管理的重要性及必要性 在现代软件开发中,事务管理是一项至关重要的技术,特别是在涉及数据库操作时。事务能够确保一系列操作要么全部成功,要么全部失败,这对于保持...
Spring事务管理是Spring框架的核心特性之一,它提供了一种强大且灵活的方式来管理应用程序中的事务边界。在企业级Java应用中,事务处理是确保数据一致性、完整性和可靠性的关键部分。本篇文章将深入探讨Spring的事务...
总的来说,Spring事务管理提供了一种灵活、强大的方式来处理应用程序中的事务,无论是在简单还是复杂的事务场景下,都能有效保证数据的一致性和完整性。通过声明式事务管理,开发者可以将关注点从事务细节中解脱出来...
Spring事务管理是Spring框架的核心特性之一,它提供了一种在Java应用中管理和协调数据库事务的标准方式。对于有Java基础的开发者来说,理解并掌握Spring事务管理至关重要,因为这有助于确保数据的一致性和完整性,...
当出现像描述中那样的问题——SQL语句执行出错但事务未回滚时,我们需要深入理解Spring事务管理的配置和机制。以下是一些关键知识点: 1. **Spring事务管理类型**: - **编程式事务管理**:通过`...
spring事务管理几种方式代码实例:涉及编程式事务,声明式事务之拦截器代理方式、AOP切面通知方式、AspectJ注解方式,通过不同方式实例代码展现,总结spring事务管理的一般规律,从宏观上加深理解spring事务管理特性...
在思维导图"Spring Transaction.twd"中,可能包含了Spring事务管理的各个概念和它们之间的关系,如事务的ACID属性(原子性、一致性、隔离性和持久性),事务管理器,以及声明式和编程式事务管理的实现方式。...
### Spring事务管理的方法 #### 一、引言 在企业级应用开发中,事务管理是一项至关重要的技术。Spring框架作为Java领域中一个非常流行的轻量级框架,为开发者提供了多种方式来实现事务管理,其中主要分为编程式...