文章目录
前言
我们在学习Spring时会学到关于事务操作的概念,本文主要介绍关于事务的概念和相关操作,此外还附上事务的相关面试题。
一、概念
1.什么是事务
事务就是用户定义的一系列数据库操作,这些操作可以视为一个完成的逻辑处理工作单元,要么全部执行,要么全部不执行,是不可分割的工作单元。
2.事务的实现方式(面试题)
(1)编程式事务管理对基于 POJO 的应用来说是唯一选择。我们需要在代码中调用beginTransaction()、commit()、rollback()等事务管理相关的方法,这就是编程式事务管理。
(2)基于 TransactionProxyFactoryBean的声明式事务管理
(3)基于 @Transactional 的声明式事务管理
(4)基于Aspectj AOP配置事务
主要就是分为两类,一类是声明式事务管理,一类是编程式事务管理。
声明式事务管理
基于AOP
面向切面的,它将具体业务与事务处理部分解耦,代码侵入性很低。有两种实现方式:
- 基于
TX
和AOP
的xml配置文件方式 - 基于@Transactional注解
基于注解的事务管理代码演示
1 、在 spring 配置文件配置事务管理器
<!--创建事务管理器--> < bean id= "transactionManager" class= "org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!--注入数据源--> < property name= "dataSource" ref= "dataSource"></ property> </ bean>
2、在 在 spring 配置文件,开启事务注解
(1)在 spring 配置文件引入名称空间 tx< 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= = "ht tp://www.springframework.org/schema/tx" xsi :schemaLocation= "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring- - beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring- - context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring- - aop.xsd d http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring- - tx.xsd">
(2)开启事务注解
<tx:annotation-driven transaction-manager= "txManager"></tx:annotation-driven>
3 、在 service 类上面( 类上面(或者 或者 service 类里面方法上面)添加事务注解
(1)@Transactional,这个注解添加到类上面,也可以添加方法上面
(2)如果把这个注解添加类上面,这个类里面所有的方法都添加事务
(3)如果把这个注解添加方法上面,为这个方法添加事务@Service @Transactional public class UserService { }
编程式事务管理
在代码中手动的使用注释或XML配置管理事务的提交、回滚等操作,代码侵入性比较强。
XML 声明式事务管理代码演示
1 、在 spring 配置文件中进行配置
第一步 配置事务管理器
第二步 配置通知
第三步 配置切入点和切面<!--1 创建事务管理器--> < bean id= "transactionManager" class= "org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!--注入数据源--> < property name= "dataSource" ref= "dataSource"></ property> </ bean> <!--2 配置通知--> < tx :advice id= "txadvice"> <!--配置事务参数--> < tx :attributes> <!--指定哪种规则的方法上面添加事务--> < tx :method name= "accountMoney" propagation= "REQUIRED"/> <!--<tx:method name="account*"/>--> </ tx :attributes> </ tx :advice> <!--3 配置切入点和切面--> < aop :config> <!--配置切入点--> < aop :pointcut id= "pt" expression= "execution(* com.guigu.spring5.service.UserService.*(..))"/> <!--配置切面--> < aop :advisor advice- - ref= "txadvice" pointcut- - ref= "pt"/> </ aop :config>
二、事务传播机制
Spring 事务传播机制的诞生是为了规定多个事务在传播过程中的行为的。比如方法 A 开启了事务,而在执行过程中又调用了开启事务的 B 方法,那么 B 方法的事务是应该加入到 A 事务当中呢?还是两个事务相互执行互不影响,又或者是将 B 事务嵌套到 A 事务中执行呢?所以这个时候就需要一个机制来规定和约束这两个事务的行为,这就是 Spring 事务传播机制所解决的问题。
Spring 事务传播机制可使用 @Transactional(propagation=Propagation.XXX) 来定义。
七种传播机制及其特点(面试题)
① PROPAGATION_REQUIRED(required:需要、依赖、依靠):(默认传播行为)如果当前没有事务,就创建一个新事务;如果当前存在事务,就加入该事务。
② PROPAGATION_REQUIRES_NEW(requires_new:需要新建):无论当前存不存在事务,都创建新事务进行执行。
③ PROPAGATION_SUPPORTS(supports:支持;拥护):如果当前存在事务,就加入该事务;如果当前不存在事务,就以非事务执行。
④ PROPAGATION_NOT_SUPPORTED(not_supported:不支持):以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
⑤ PROPAGATION_NESTED(nested:嵌套的):如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则按REQUIRED属性执行。
⑥ PROPAGATION_MANDATORY(mandatory:强制性的):如果当前存在事务,就加入该事务;如果当前不存在事务,就抛出异常。
⑦ PROPAGATION_NEVER(never:从不):以非事务方式执行,如果当前存在事务,则抛出异常。
总结
在这里我只对Spring的事务进行一个简单的基础概念介绍,如果需要进一步了解,需要自己结合案例去实现事务才能更好理解,尤其是事物的传播机制,相关代码可以去看这一篇文章。