1 Spring 中事务简介

1.1 事务定义

事务是一个业务,是一个不可分割的逻辑工作单元,基于事务可以更好地保证事务的正确性.

1.2事务特性

事务具备ACID(事务四大性的简写)特性,分别是:
原子性:一个事务中多个操作要么都成功,要么都失败,简称一荣俱碎.
一致性:数据操作前后应该保持逻辑不变,如存钱操作,存之前的余额加上存的金额就是存之后的总钱数
隔离性(独立性):事务与实务应该是相互隔离的.相互独立的.
持久性:事务一旦提交,数据就要持久保存在数据库中.

2 Spring 中事务管理

2.1 spring 中事务方式概述

spring框架中提供了一种声明事务的方式,此方式是基于AOP代理的,可以将具体业务逻辑与事务处理进行解耦.也就是说可以让我们的业务代码逻辑不受污染或受的污染少一点,其就是基于事物的四大性所实现.
在spring boot项目中,其内部提供了事务的自动配置,只需要在项目中添加相应的依赖spring-boot-starter-jdbc时,框架会自动为我们的项目注入事务管理器对象,其中最常用的对象是DateSourceTransactionManager.

2.2 Spring中事务管理实现

以下将描述以@Transactional注解进行声明事务管理,因其是基于AOP代理方式实现的,首先在pom.xml添加AOP依赖和spring-boot-starter-jdbc管理事务对象依赖

<!-- 添加AOP的依赖 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-aop</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-jdbc</artifactId>
		</dependency>

首先在配置类上添加注解@EnableTransactionManagement,新版本可以不加,如新版的spring boot,然后将@Transactional注解加到你想要添加事务的业务类或方法上,并可以配置相应的属性,其代码如下:

@Transactional(timeout = 30,
               readOnly = false,
               isolation = Isolation.READ_COMMITTED,
               rollbackFor = Throwable.class,
               propagation = Propagation.REQUIRED)
  @Service 
  public class implements SysUserService {
        @Transactional(readOnly = true)
    @Override
	 public PageObject<SysUserDeptVo> findPageObjects(
			String username, Integer pageCurrent) {
      …
       }
}

我这是加载整个业务层和数据查询分页的业务方法上,其中代码中的@Transactional注解用于描述类或方法,告诉spring框架哦网我们要在此类的所有方法或相应的方法上执行相应的事务.
@Transactional常用属性说明:
timeout:事务的超时时间,单位秒,默认是-1,表示没有超时显示,如配置了具体时间,则超过时间限制事务还没完成将会自动回滚事务.
read-only:指定事务是否为只读事务,默认值是false,一般用于不需要事物的方法,如读取数据.
rollback-for:用于指定能够触发事务回滚的异常类型,如果有多个异常,异常类型间用逗号隔开.
no-rollback-for:抛出指定的异常类型,不回滚事务.
isolation:事务的隔离级别,默认采用DEFAULT.
propagation:事物的传播性,在上面这个例子中,传播性被设为了REQUIRED,这是默认值,意思是支持当前已经存在的事务并参与它,如果还没有事务,就创建一个新事务.

spring 中事务控制过程分析,如图下图所示::

Spring 事务异常 spring的事务处理_Spring 事务异常


如图可以看出,spring 事务管理底层由实现接口代理JDK或CGBLIB继承方式代理,通过AOP代理事务增加,当我们执行事务特性的目标方式时,系统会通过目标对象的代理对象调用DataSourceTransactionManager对象,在事务开始的时,执行doBegin方法,事务结束时执行doCommit或doRollback方法。

Springz 中事务管理小结

spring声明式事务是spring最核心的,最常用的功能,用于spring通过IOC和AOP的功能非常详细的实现类声明式事务的功能,对于一般的开发者而言无需了解声明事务内部的细节,仅需懂得如何配置就可以了,但对于中高端的开发者而言,还需了解其内部机制.