Skip to content

spring的事务控制都是基于AOP的,它既可以使用编程的方式时间,也可以使用配置的方式实现

编程式事务

就是将业务代码和事务代码放在一起书写,耦合度太高

声明式事务

就是将事务的代码和业务代码隔离开发,然后通过一段配置让他们组装运行,最后达到事务控制的目的

API名词解析

隔离级别

隔离级别含义
DEFAULT使用数据库默认的隔离级别
READ_UNCOMMITTED可能导致脏读、幻读或不可重复读。
READ_COMMITTED(Oracle 默认级别)可防止脏读,但幻读和不可重复读仍可能会发生。
REPEATABLE_READ(MySQL默认级别)可防止脏读和不可重复读,但幻读仍可能发生。
SERIALIZABLE确保不发生脏读、不可重复读和幻影读。

传播行为

关键字描述
REQUIRED【默认】如果有事务在运行,当前方法将会在该事务中运行。否则,会启动一个新的事务,并在自己的事务中运行
SUPPORTS如果有事务在运行,当前方法将会在该事务中运行。否则,它可以不在一个事务中运行
MANDATORY表示该方法必须在事务中运行,如果当前事务不存在,则会抛出一个异常
REQUERS_NEW表示当前方法必须运行在它自己的事务中。一个新的事务将被启动。如果存在当前事务,在该方法执行期间,当前事务会被挂起
NOT_SUPPORTED表示该方法不应该运行在事务中。如果存在当前事务,在该方法运行期间,当前事务将被挂起
NEVER表示该方法不应该运行在事务中。如果当前正有一个事务在运行,则会抛出异常
NESTED表示如果当前已经存在一个事务,那么该方法将会在嵌套事务中运行。嵌套的事务可以独立于当前事务进行单独地提交或回滚。如果当前事务不存在,那么其行为与REQUIRED一样

其他

关键字作用描述
timeout超时时间默认值是-1,没有超时限制。如果有,以秒为单位进行设置
read-only是否是只读事务只读事务(增 删 改不能使用,只能查询使用)

事务控制

Spring中的事务控制主要就是通过三个API实现的

PlatformTransactionManager

  • TransactionStatus getTransaction(TransactionDefinition definition); 功能:获取事务的状态信息

  • void commit(TransactionStatus status); 功能:提交事务

  • void rollback(TransactionStatus status); 功能:回滚事务

TransactionDefinition

  • 获取事务对象名称 — String getName()
  • 获取事务隔离级 — int getlsolationLevelf()
  • 获取事务传播行为 — int getPropagationBehavior()
  • 获取事务超时时间 — int getTimeoutf()
  • 获取事务是否只读 — boolean isReadOnlyf()

TransactionStatus

  • 刷新事务 — void flush()
  • 获取是否是否存在存储点 — boolean hasSavepointf)
  • 获取事务是否完成 — boolean isCompletedf)
  • 获取事务是否为新的事务 — boolean isNewTransaction()
  • 获取事务是否回滚 — boolean isRollbackOnlyf()
  • 设置事务回滚void setRollbackOnly()

代码

maven:

xml
<dependency> 		
    <groupId>org.springframework</groupId>
    <artifactId>spring-orm</artifactId>
    <version>5.1.5.RELEASE</version>
</dependency>

基于XML的配置

配置事务管理器

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

配置事务的规则

xml