Spring事务简介,事务角色,事务属性

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Spring事务简介,事务角色,事务属性

1.Spring事务简介

  • 事务作用:在数据层保障一系列的数据库操作同成功同失败
  • Spring事务作用:在数据层或业务层保障一系列的数据操作同成功同失败
public interface PlatformTransactionManager{
  void commit(TransactionStatus status) throws TransactionException;
  void rollback(TransactionSattus status) throws TransactionException;
}
public class DataSourceTransactionManager{
  ...
}

案例:银行账户转账

需求:

实现任意两个账户间转账操作

需求微缩:

A账户减钱,B账户加钱

分析:

数据层提供基础操作,指定账户减钱(outMoney),指定账户加钱(inMoney)

业务层提供转账操作(transfer),调用减钱和加钱的操作

提供2个账号和操作金额执行转账操作

基于Spring整合MyBatis环境搭建上述操作

结果分析:

程序正常执行时,账号金额A减B加,没有问题

程序出现异常,转账失败,单是异常之前操作成功,异常之后操作失败,整体业务失败

2.事务角色

添加事务管理操作流程

在业务层接口上添加Spring事务管理

public interface AccountService{
  @Transactional
  public void transfer(String out,String in,Double money);
}

注意:Spring注解式事务通常添加在业务层接口中而不会添加到业务层实习类中,降低耦合度

注解式业务可以添加到业务方法上表示开启事务,也可以添加到接口上表示当前接口所有方法开启事务

设置事务管理

@Bean
public PlatformTransactionManager transactionManager(DataSource dataSoure){
  DataSouceTransactionManager ptm = new DataSourceTransactionManager();
  ptm.setDataSource(dataSource);
  return ptm;
}

注意:事务管理要根据实现技术进行选择MyBatis框架使用JDBC事务

开启注解事务驱动

@Configuration
@ComponentScan("com.hcx")
@PropertySource("classpath:jdbc.properties")
@Import({JdbcConfig.class,MybatisConfig.class})
@EnableTransactionManagement
public class SpringConfig{
}

Spring事务角色(通过相同数据源来管理)

事务角色

事务管理员:发起事务方,在Spring中通常指代业务层开启事务的方法

事务协调员:加入事务方,在Spring中通常带着数据层方法,也可以是业务层方法

事务相关配置

注意:IOException不属于运行时异常,事务回滚不管理

事务传播行为

事务传播行为:事务协调员对事务管理员所携带事务的处理态度

Spring中七种事务传播行为

事务传播行为类型说明

PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。

PROPAGATION_SUPPORTS  支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY 使用当前的事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW  新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER 以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED  如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

案例:转账业务追加日志

需求:实现任意两个账户间转账操作,并对每次转账操作在数据库进行留痕

需求微缩:A账户减钱,B账户加钱,数据库记录日志

分析:

基于转账操作案例添加日志模块,实现数据库中记录日志

业务层转账操作(transfer),调用减钱,加钱与记录日志功能

实现效果预期:

无论转账是否成功,均进行转账操作的日志留痕

存在问题:

日志的记录与转账操作隶属于同一事务,同成功同失败

失效效果预取改进:

无论转账操作是否成功,日志必须保留

步骤

在业务层接口上添加Spring事务,设置事务传播行为REQUIRES_NEW(需要新事务)

@Service
public class LogServiceImpl implements LogService{
  @Autowired
  private LogDao logDao;
  @Transactional(propagation = Propagation.REQUIRES_NEW)
  public void log(String out,String in,Double money){
    logDao.log("转账操作由"+out+"到"+in+",金额:"+money);
  }
}

3.事务属性

在Spring框架中,事务属性(Transaction Attributes)是指在定义和管理事务时所使用的一组属性或配置,用于指定事务的行为和特性。Spring提供了一种声明式事务管理的方式,通过在方法或类级别上使用注解或XML配置来定义事务属性。

Spring框架中的事务属性包括以下几个方面:

  1. 传播行为(Propagation Behavior):指定事务方法被嵌套调用时,事务如何传播到嵌套调用的方法中。例如,是否创建新的事务,是否加入现有的事务,等等。
  2. 隔离级别(Isolation Level):指定事务方法在访问数据时所采用的隔离级别,用于控制事务之间的数据可见性。例如,读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)、串行化(Serializable)等。
  3. 回滚规则(Rollback Rules):指定在哪些异常情况下事务应该回滚。可以配置一组异常类型,当方法抛出这些异常时,事务将会回滚。
  4. 超时时间(Timeout):指定事务的超时时间,即事务执行的最大时长。如果在指定的时间内事务没有完成,则会自动回滚。
  5. 只读(Read-Only):指定事务是否为只读事务。只读事务可以优化数据库访问,但是不能用于写操作。
  6. 回滚标志(Rollback Only):指定是否将事务标记为只读。如果将事务标记为只读,则事务将被标记为仅回滚,而不是回滚到保存点。

通过合理配置这些事务属性,可以对事务进行精细化的控制和管理,从而确保系统在并发操作下的数据完整性和一致性。


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
9天前
|
Java 开发者 Spring
Spring高手之路24——事务类型及传播行为实战指南
本篇文章深入探讨了Spring中的事务管理,特别是事务传播行为(如REQUIRES_NEW和NESTED)的应用与区别。通过详实的示例和优化的时序图,全面解析如何在实际项目中使用这些高级事务控制技巧,以提升开发者的Spring事务管理能力。
20 1
Spring高手之路24——事务类型及传播行为实战指南
|
3天前
|
XML Java 数据库连接
Spring中的事务是如何实现的
Spring中的事务管理机制通过一系列强大的功能和灵活的配置选项,为开发者提供了高效且可靠的事务处理手段。无论是通过注解还是AOP配置,Spring都能轻松实现复杂的事务管理需求。掌握这些工具和最佳实践,能
10 3
|
2月前
|
Java 数据库连接 数据库
spring复习05,spring整合mybatis,声明式事务
这篇文章详细介绍了如何在Spring框架中整合MyBatis以及如何配置声明式事务。主要内容包括:在Maven项目中添加依赖、创建实体类和Mapper接口、配置MyBatis核心配置文件和映射文件、配置数据源、创建sqlSessionFactory和sqlSessionTemplate、实现Mapper接口、配置声明式事务以及测试使用。此外,还解释了声明式事务的传播行为、隔离级别、只读提示和事务超时期间等概念。
spring复习05,spring整合mybatis,声明式事务
|
12天前
|
JavaScript NoSQL Java
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
28 0
|
1月前
|
Java 关系型数据库 MySQL
Spring事务失效,我总结了这7个主要原因
本文详细探讨了Spring事务在日常开发中常见的七个失效原因,包括数据库不支持事务、类不受Spring管理、事务方法非public、异常被捕获、`rollbackFor`属性配置错误、方法内部调用事务方法及事务传播属性使用不当。通过具体示例和源码分析,帮助开发者更好地理解和应用Spring事务机制,避免线上事故。适合所有使用Spring进行业务开发的工程师参考。
29 2
|
1月前
|
Java 程序员 Spring
Spring事务的1道面试题
每次聊起Spring事务,好像很熟悉,又好像很陌生。本篇通过一道面试题和一些实践,来拆解几个Spring事务的常见坑点。
Spring事务的1道面试题
|
2月前
|
Java Spring
Spring 事务传播机制是什么?
Spring 事务传播机制是什么?
22 4
|
1月前
|
监控 Java 数据库
Spring事务中的@Transactional注解剖析
通过上述分析,可以看到 `@Transactional`注解在Spring框架中扮演着关键角色,它简化了事务管理的复杂度,让开发者能够更加专注于业务逻辑本身。合理运用并理解其背后的机制,对于构建稳定、高效的Java企业应用至关重要。
44 0
|
Java Spring 容器
Spring 源码解析 | populateBean 属性填充(上)
本文主要是讲 Spring 容器的启动过程主要是以题干的方式进行可能不回涉及过多的细节,希望大家阅读本文能对 Spring 源码有一个简单的了解。 环境介绍: Spring 5.3.10 Jdk 11
222 0
Spring 源码解析 | populateBean 属性填充(上)
|
Java Spring 容器
Spring 源码解析 | populateBean 属性填充(下)
本文主要是讲 Spring 容器的启动过程主要是以题干的方式进行可能不回涉及过多的细节,希望大家阅读本文能对 Spring 源码有一个简单的了解。 环境介绍: Spring 5.3.10 Jdk 11
179 0