Spring Boot微服务项目实战(第2版)学习笔记-第5章Spring Boot事务支持


本章主要介绍Spring声明式事务、Spring注解事务行为以及在SpringBoot中如何使用方法级别事务和类级别事务等。

1.Spring事务介绍

1.1 Spring事务回顾

事务管理是企业级应用程序开发中必不可少的技术,用来确保数据的完整性和一致性。事务有4大特性(ACID):原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)。作为企业级应用程序框架,Spring在不同的事务管理API之上定义了一个抽象层PlatformTransactionManager,应用程序开发人员不必了解底层的事务管理API,就可以使用Spring的事务管理机制

Spring既支持编程式事务管理(也称编码式事务),也支持声明式的事务管理。编程式事务管理是指将事务管理代码嵌入到业务方法中来控制事务的提交和回滚。在编程式事务中,必须在每个业务操作中包含额外的事务管理代码。声明式事务管理是指将事务管理代码从业务方法中分离出来,以声明的方式来实现事务管理。大多数情况下声明式事务管理比编程式事务管理更好用。Spring通过Spring AOP框架支持声明式事务管理

Spring并不直接管理事务,而是提供了许多内置事务管理器实现,常用的有DataSourceTransactionManager、JdoTransactionManager、JpaTransactionManager以及HibernateTransactionManager,等等。

1.2 Spring声明式事务

Spring配置文件中关于事务配置由3个组成部分,分别是DataSourceTransactionManager代理机制。无论哪种配置方式,一般变化的只是代理机制部分。DataSource和TransactionManager这两部分只会根据数据访问方式有所变化,比如使用Hibernate进行数据访问时,DataSource实现为SessionFactory,TransactionManager的实现为HibernateTransactionManager。

Spring声明式事务配置提供5种方式,而基于Annotation注解方式目前比较流行,所以这里只简单介绍基于注解方式配置Spring声明式事务。我们可以使用@Transactional注解在类或者方法上表明该类或者方法需要事务支持,被注解的类或者方法被调用时,Spring开启一个新的事务,当方法正常运行时,Spring会提交这个事务。具体例子如下:

@Transactional
public AyUser updateUser(){
	//执行数据库操作
}

这里需要注意的是,@Transactional注解来自org.springframework.transaction.annotation。Spring提供了@EnableTransactionManagement注解在配置类上来开启声明式事务的支持。使用@EnableTransactionManagement后,Spring容器会自动扫描注解@Transactional的方法和类。

1.3 Spring注解事务行为

当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。例如,方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。事务的传播行为可以在@Transactional的属性中指定。Spring定义了7种传播行为,具体如表所示。
在这里插入图片描述
隔离级别定义了一个事务可能受其他并发事务影响的程度。在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务。并发虽然是必需的,但也可是会导致许多问题,并发事务所导致的问题可以分为以下3类。

  • 脏读(Dirty reads):脏读发生在一个事务读取了另一个事务改写但尚未提交的数据。如果改写在稍后被回滚了,那么第一个事务获取的数据就是无效的。
  • 不可重复读(Nonrepeatable read):不可重复读发生在一个事务执行相同的查询两次或两次以上,但是每次都得到不同的数据时。这通常是因为另一个并发事务在两次查询期间更新了数据。
  • 幻读(Phantom read):幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录。

针对这些问题,Spring提供了5种事务的隔离级别,具体如表所示。

在这里插入图片描述
@Transactional可以通过propagation属性定义事务行为,属性值分别为REQUIRED、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER以及NESTED,分别对应表中的内容。可以通过isolation属性定义隔离级别,属性值分别为DEFAULT、READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ以及SERIALIZABLE。

还可以通过timeout属性设置事务过期时间,通过readOnly指定当前事务是否是只读事务,通过rollbackFor(noRollbackFor)指定哪个或者哪些异常可以引起(或不可以引起)事务回滚

2.Spring Boot事务使用

2.1 Spring Boot事务介绍

Spring Boot开启事务很简单,只需要一个注解@Transactional就可以了,因为在Spring Boot中已经默认对JPA、JDBC、MyBatis开启了事务,引入它们依赖的时候,事物就默认开启。当然,如果你需要用其他的ORM框架,比如BeatlSQL,就需要自己配置相关的事务管理器。

Spring Boot用于配置事务的类为TransactionAutoConfiguration,此配置类依赖于JtaAutoConfiguration和DataSourceTransactionManagerAutoConfiguration,具体查看源代码可知,而DataSourceTransactionManagerAutoConfiguration已开启了对声明式事务的支持,所以在Spring Boot中,无须显示开启使用@EnableTransactionManagement。

2.2 类级别事务

在第2章中,我们已经在Spring Boot中集成了Spring Data JPA,同时开发了AyUserRepository类实现JpaRepository接口,JpaRepository接口是不开启事务的,而SimpleJpaRepository默认是开启事务的,所以我们需要手工给AyUserRepository添加事务。AyUserRepository类中的方法是在服务层类AyUserServiceImpl中被使用,而事务一般都是加在服务层,因此可以在AyUserServiceImpl类上添加@Transactional注解来开启事务。AyUserServiceImpl类开启事务的代码如下:

@Transactional
@Service
public class AyUserServiceImpl implements AyUserService {
	@Resource(name="ayUserRepository")
	private AyUserRepository ayUserRepository;
	// 忽略代码
}

@Transactional注解在类上,意味着此类的所有public方法都是开启事务的。

2.3 方法级别事务

@Transactional除了可以注解在类上,还可以注解到方法上面。当注解在类上的时候意味着此类的所有public方法都是开事务的。如果类级别和方法级别同时使用了@Transactional注解,则使用方法级别注解覆盖类级别注解。可以给AyUserServiceImpl类中的save()方法添加事务,同时在save完成之后抛出NullPointException异常,查看数据是否可以回滚,具体代码如下:

//注解在类上
@Transactional
@Service
public class AyUserServiceImpl implements AyUserService {
	@Resource(name ="ayUserRepository")
	private AyUserRepository ayUserRepository;
	
	//注解在方法上
	@Transactional
	@Override
	public AyUser save(AyUser ayUser){
		AyUser saveUser = ayUserRepository.save(ayUser);
		//出现空指针异常
		String error =null;
		error.split("/");
		return saveUser;
	}
}

2.4 测试

我们在测试类DemoApplicationTests中添加测试方法,具体代码如下:

@Test
public void testTransaction(){
	AyUser ayUser = new AyUser();
	ayUser.setId("3");
	ayUser.setName("阿华");
	ayUser.setPassword("123");
	ayUserService.save(ayUser);
}

运行testTransaction()单元测试用例,当代码执行完成后,由于方法save保持数据时,出现空指针,数据会回滚,数据库查询不到保存的数据。现在我们把AyUserServiceImpl类上的@Transactional注解和save方法上的@Transactional注解全部注释掉,再次执行testTransaction()单元测试用例,查询数据库,发现数据库多了一条数据。

3.微服务同时调用多个接口时,是怎么支持事务的?

可以使用Spring Boot集成 Aatomikos来解决分布式事务,但是笔者一般不建议这样使用,因为使用分布式事务会增加请求的响应时间,影响系统的TPS。一般在实际工作中,会利用消息的补偿机制来处理分布式的事务。

疑问??书中无该内容,实际中使用Aatomikos,后续需查找资料补充"消息的补偿机制",对比两者区别。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 很高兴听到您对Spring Boot 2的学习感兴趣。Spring Boot是一个基于Spring框架的快速开发应用程序的工具,它提供了一种简单的方式来创建和配置Spring应用程序。以下是一些学习Spring Boot 2的笔记: 1. Spring Boot 2的新特性:Spring Boot 2相对于Spring Boot 1.x本来说,有许多新的特性和改进。例如,它支持Java 9和10,提供了更好的响应式编程支持,以及更好的安全性和监控功能。 2. Spring Boot 2的核心组件:Spring Boot 2的核心组件包括Spring Framework、Spring MVC、Spring Data和Spring Security等。这些组件提供了一系列的功能和工具,使得开发人员可以更加轻松地构建和管理应用程序。 3. Spring Boot 2的配置:Spring Boot 2的配置非常简单,它提供了一种基于注解的方式来配置应用程序。开发人员可以使用@Configuration和@Bean注解来定义配置类和Bean。 4. Spring Boot 2的启动器:Spring Boot 2提供了一系列的启动器,这些启动器可以帮助开发人员快速地集成各种常用的框架和库,例如Spring Data JPA、Spring Security、Thymeleaf等。 5. Spring Boot 2的测试:Spring Boot 2提供了一系列的测试工具,例如Spring Boot Test、Mockito、JUnit等。这些工具可以帮助开发人员编写高质量的单元测试和集成测试。 希望这些笔记对您学习Spring Boot 2有所帮助。如果您有任何问题或疑问,请随时联系我。 ### 回答2: Spring Boot 是一个非常流行的开源框架,它的目的是使 Spring 应用程序的开发过程更加简单、快速和高效。Spring Boot 2 是 Spring Boot 框架的第二个本,已经成为了当今业界最流行的 Java 开发框架之一。 Spring Boot 2 的新特性: 1. 支持 JDK 9。Spring Boot 2 已经支持 JDK 9 所带来的新特性和功能。 2. 基于 Reactive Streams 的编程模型。Spring Boot 2 增加了对 Reactive Streams 的支持,可以开发响应式应用程序,从而提高了系统的吞吐量和性能。 3. 异步服务器支持Spring Boot 2 已经支持多种异步服务器,包括 Netty、Undertow 和 Tomcat。 4. 更全面的 Actuator 组件。Actuator 是 Spring Boot 的监控和管理组件,Spring Boot 2 在 Actuator 组件上增加了更多的指标、健康检查和应用程序信息。 5. 更好的自定义配置。Spring Boot 2 简化了自定义配置的流程,使得用户可以更快速地配置应用程序。 学习 Spring Boot 2 的步骤如下: 1. 掌握 Spring 基础知识。学习 Spring Boot 2 前需要掌握 Spring MVC、Spring Data 等相关的知识。 2. 下载安装 Spring BootSpring Boot 2 可以在官网上下载。 3. 学习 Spring Boot 核心组件。包括 Spring IoC、Spring AOP、Spring MVC 等核心组件。 4. 开发一个 Spring Boot 应用程序。可以从一个简单的 Hello World 开始,逐渐增加功能,学习和理解 Spring Boot 的各种特性和功能。 5. 掌握 Spring Boot 的自动配置。Spring Boot 的自动配置可以大大减少开发人员的工作量,学习和掌握自动配置非常重要。 总之,学习 Spring Boot 2 需要不断地实践和探索,只有通过实际的开发经验才能真正掌握和学会这个框架。 ### 回答3: Spring Boot是一款基于Spring框架的快速应用开发框架。在应用开发的过程中,Spring Boot可以自动配置一个相对完整的Spring应用程序,从而大大减少了开发者的工作量,提高了开发效率。显然,它的学习是很有必要的。 Spring Boot 2.x本相比于1.x本在很多方面都进行了升级和改进。在学习的过程中,需要关注的重点在以下几点: 1. 新建Spring Boot项目 Spring Boot提供了Spring Initializr来快速创建新的Spring Boot项目。在构建项目的过程中,我们可以自定义项目的基本信息、项目类型、依赖关系等,可以根据需求灵活选择。 2. Spring Boot自动配置 Spring Boot借助于自动配置功能,可以为开发者免去大量的配置工作。Spring Boot把一些常用的配置提取为Starter,开发者只需要引入这些Starter即可实现自动配置,大大降低了开发成本。 3. Spring Boot集成 Spring Boot集成了众多流行的框架,如MyBatis、Hibernate、JPA、Thymeleaf等,只需要简单的配置就可以实现对这些框架的集成,使得在开发中更加方便。 4. Spring Boot监控管理 Spring Boot通过Actuator提供了一系列配置和管理服务,可以实现对Spring Boot应用程序的监控和管理。开发者可以通过这些服务来监控应用程序的运行状态、访问量、资源使用情况等。 5. Spring Boot测试 Spring Boot天生适合进行单元测试和集成测试,可以使用JUnit、Mockito、Spring Test等框架进行测试。同样可以利用Spring Boot提供的Test Starter进行自动配置,减少测试的开发成本。 以上就是Spring Boot 2的一些学习笔记,它的结构简洁,代码清晰,便于开发者使用。无疑,Spring Boot 2是一个非常适合作为开发者日常工作的框架。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Eden_Bristol

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值