文章目录

  • 0.事务简介
  • 0.1 什么是事务。
  • 0.2 事务的四大特性:
  • 0.3不考虑隔离性引发的问题
  • 0.4解决读问题:设置事务隔离级别
  • 1.Spring 事务控制我们要明确的
  • 2.Spring 中事务控制的 API 介绍
  • 2.1 PlatformTransactionManager
  • 2.2 TransactionDefinition
  • 2.2.1 事务的隔离级别
  • 2.2.2 事务的传播行为
  • 2.2.3 超时时间
  • 2.2.4是否是只读事务
  • 2.2.3 TransactionStatus
  • 3事务的配置步骤
  • 3.2.1 第一步: 配置事务管理器
  • 3.2.2 第二步:配置事务的通知引用事务管理器
  • 3.2.3 第三步:配置事务的属性
  • 3.2.4 第四步:配置 AOP 切入点表达式
  • 3.2.5 第五步:配置切入点表达式和事务通知的对应关系


0.事务简介

0.1 什么是事务。

简单的说,是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合(工作逻辑单元)

0.2 事务的四大特性:

1 、原子性
事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做
2 、一致性
事 务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态。
3 、隔离性
一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
4 、持续性
也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。

0.3不考虑隔离性引发的问题

Spring在进行事务管理时可以捕获异常吗 spring的事务控制_事务控制

0.4解决读问题:设置事务隔离级别

Spring在进行事务管理时可以捕获异常吗 spring的事务控制_数据库_02

1.Spring 事务控制我们要明确的

第一: JavaEE 体系进行分层开发,事务处理位于业务层, Spring 提供了分层设计业务层的事务处理解决方案。
第二: spring 框架为我们提供了一组事务控制的接口。这组接口是在spring-tx-5.0.2.RELEASE.jar 中。
第三: spring 的事务控制都是基于 AOP 的,它既可以使用编程的方式实现,也可以使用配置的方式实现。

2.Spring 中事务控制的 API 介绍

2.1 PlatformTransactionManager

此接口是 spring 的事务管理器,它里面提供了我们常用的操作事务的方法,

Spring在进行事务管理时可以捕获异常吗 spring的事务控制_事务控制_03


开发中使用的实现类

Spring在进行事务管理时可以捕获异常吗 spring的事务控制_事务控制_04

2.2 TransactionDefinition

Spring在进行事务管理时可以捕获异常吗 spring的事务控制_事务管理_05

2.2.1 事务的隔离级别

Spring在进行事务管理时可以捕获异常吗 spring的事务控制_事务控制_06

2.2.2 事务的传播行为

Spring在进行事务管理时可以捕获异常吗 spring的事务控制_事务控制_07

2.2.3 超时时间

默认值是-1,没有超时限制。如果有,以秒为单位进行设置。

2.2.4是否是只读事务

建议查询时设置为只读。

2.2.3 TransactionStatus

Spring在进行事务管理时可以捕获异常吗 spring的事务控制_事务控制_08

3事务的配置步骤

3.2.1 第一步: 配置事务管理器

<!-- 配置一个事务管理器 -->
<bean id="transactionManager"
	class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	
	<!-- 注入 DataSource -->
	<property name="dataSource" ref="dataSource"></property>
</bean>

3.2.2 第二步:配置事务的通知引用事务管理器

<!-- 事务的配置 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
</tx:advice>

3.2.3 第三步:配置事务的属性

<!--在 tx:advice 标签内部 配置事务的属性 -->
<tx:attributes>
	<!-- 指定方法名称:是业务核心方法
	read-only:是否是只读事务。默认 false,不只读。
	isolation:指定事务的隔离级别。默认值是使用数据库的默认隔离级别。
	propagation:指定事务的传播行为。
	timeout:指定超时时间。默认值为: -1。永不超时。
	rollback-for:用于指定一个异常,当执行产生该异常时,事务回滚。产生其他异常,事务不回滚。
	没有默认值,任何异常都回滚。
	no-rollback-for:用于指定一个异常,当产生该异常时,事务不回滚,产生其他异常时,事务回
	滚。没有默认值,任何异常都回滚。
	-->
	
	<tx:method name="*" read-only="false" propagation="REQUIRED"/>
	<tx:method name="find*" read-only="true" propagation="SUPPORTS"/>
</tx:attributes>

3.2.4 第四步:配置 AOP 切入点表达式

<!-- 配置 aop -->
<aop:config>
	<!-- 配置切入点表达式 -->
	<aop:pointcut id="pt1" expression="execution(* com.itcase.service.impl.*.*(..))"
	/>
</aop:config>

3.2.5 第五步:配置切入点表达式和事务通知的对应关系

<!-- 在 aop:config 标签内部: 建立事务的通知和切入点表达式的关系 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="pt1"/>