事务的七种传播行为及其应用场景

简介: 本文介绍了事务的七种传播行为及其应用场景,包括 PROPAGATION_REQUIRED、PROPAGATION_SUPPORTS、PROPAGATION_REQUIRES_NEW 等,帮助开发者理解事务管理机制。同时讲解了 Java 中 SQL 操作与对象数据不同步的问题,强调重新查询与手动管理的必要性,并说明 MyBatis 批量操作的最佳实践。

事务:传播行为

  1. PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就 加入该事务,该设置是最常用的设置。
  2. PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不 存在事务,就以非事务执行。
  3. PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前 不存在事务,就抛出异常。
  4. PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。
  5. PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前 事务挂起。
  6. PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
  7. PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行(a是父事务,b是子事务,子事务有创建回滚点savepoint,父事务回滚则所有子事务都回滚。子事务回滚到回滚点父事务继续执行,但是由于子事务失败父事务最终也会提交失败)。如果当前没有事务,则 按REQUIRED属性执行。

理解:默认条件事务a,事务b  b{a}

1.required: 有新事务加入,则跟着新事物走, eg:使用required, a要跟着b走,只要b回滚(有异常发生),则 a也跟着回滚,等同于事务a,b均未成功

2.required_new : eg:使用required_new ,但是a,b不存在相互影响,

b异常发生在a执行之前,则b回滚,但是a压根没有执行,

b异常发生在a执行之后,则b会回滚,但是a正常commit(执行完成)

java中执行sql之后,不一定会直接映射到java对象中,sql操作的是数据库

// 示例流程
Emp emp = empMapper.selectById(37); // 1. 从数据库查询,映射到Java对象
empExprMapper.deleteByEmpId(37);    // 2. 删除数据库记录
System.out.println(emp.getExprList()); // 3. Java对象中的列表仍存在
  • 步骤 1:MyBatis 执行查询,将数据库数据映射到emp对象的exprList
  • 步骤 2:删除操作仅影响数据库,不会修改内存中的emp对象
  • 步骤 3:Java 对象中的exprList仍然保留着查询时的数据
  1. 数据存储位置独立:Java 对象在内存,数据库在磁盘,两者不会自动同步
  2. ORM 的映射时机:仅查询操作会将数据库数据映射到 Java 对象
  3. 保持同步的方法
  • 增删改后若需要最新数据,必须重新查询
  • 手动管理 Java 对象状态,与数据库操作保持逻辑一致
  1. 缓存的影响:删除操作后建议刷新缓存,避免读取旧数据

数据同步的黄金法则

  1. 增删改操作不自动更新对象:数据库操作与 Java 对象是分离的
  2. 需要最新数据必须重新查询:通过select语句获取最新映射
  3. 前端渲染依赖显式数据传递
  • 方式 1:后端返回查询结果
  • 方式 2:前端发起查询请求
  1. 事务保证一致性,但不保证同步:事务内可查询最新数据,事务外必须重新查询

sql语句在Java中的xml文件执行,使用foreach循环,可以循环整个语句吗,还是只能循环片段,比如:delete from emp where in{ id}多个id批量删除,可以只循环id或者整个语句循环吗

答:循环整个语句不建议,一般循环的是sql片段(整个会导致效率低下,MyBatis 会将其拼接为多个 DELETE 语句,而不是一次一次的执行

delete from emp 
    where id in (
        <foreach collection="ids" item="id" separator=",">
            #{id}  //根据id进行删除,应该循环的是id,而不是,整个片段
        </foreach>
    )


相关文章
|
SQL 关系型数据库 数据库
学习分布式事务Seata看这一篇就够了,建议收藏
学习分布式事务Seata看这一篇就够了,建议收藏
24144 2
|
8月前
|
XML JSON Java
Spring框架中常见注解的使用规则与最佳实践
本文介绍了Spring框架中常见注解的使用规则与最佳实践,重点对比了URL参数与表单参数的区别,并详细说明了@RequestParam、@PathVariable、@RequestBody等注解的应用场景。同时通过表格和案例分析,帮助开发者正确选择参数绑定方式,避免常见误区,提升代码的可读性与安全性。
|
5月前
|
SQL 缓存 Java
【Java架构必看】Mybatis的工作原理
MyBatis执行分启动与运行两阶段:启动时加载配置,运行时代理执行SQL。通过JDK动态代理生成Mapper接口,结合缓存机制与Executor执行SQL,最终由TypeHandler完成结果映射。
484 4
|
8月前
|
XML Java Maven
@Bean`注解的使用方法及其作用
本文介绍了Spring框架中`@Bean`注解的使用方法及其作用,包括如何将第三方类库加入Spring容器,配置类与`@Configuration`的配合使用,以及通过`@ConditionalOnClass`、`@ConditionalOnMissingBean`等条件注解控制Bean的加载。同时讲解了Maven父子模块间的依赖关系及配置方式,帮助开发者更好地管理项目结构与依赖注入。
|
8月前
|
SQL JSON 安全
符串和集合是否为空的方法
本文介绍了编程中判断字符串和集合是否为空的方法,强调在判断集合时应先检查是否初始化,避免空指针异常(NPE)。同时讲解了逻辑或(||)的执行规则,以及 AOP 中环绕通知与其他通知的区别,最后介绍了各层返回结果的规范及三层架构的协作原则。
|
SQL 存储 大数据
Flink 基础详解:大数据处理的强大引擎
Apache Flink 是一个分布式流批一体化的开源平台,专为大规模数据处理设计。它支持实时流处理和批处理,具有高吞吐量、低延迟特性。Flink 提供统一的编程抽象,简化大数据应用开发,并在流处理方面表现卓越,广泛应用于实时监控、金融交易分析等场景。其架构包括 JobManager、TaskManager 和 Client,支持并行度、水位线、时间语义等基础属性。Flink 还提供了丰富的算子、状态管理和容错机制,如检查点和 Savepoint,确保作业的可靠性和一致性。此外,Flink 支持 SQL 查询和 CDC 功能,实现实时数据捕获与同步,广泛应用于数据仓库和实时数据分析领域。
10888 42
|
Java 数据库 开发者
详细介绍SpringBoot启动流程及配置类解析原理
通过对 Spring Boot 启动流程及配置类解析原理的深入分析,我们可以看到 Spring Boot 在启动时的灵活性和可扩展性。理解这些机制不仅有助于开发者更好地使用 Spring Boot 进行应用开发,还能够在面对问题时,迅速定位和解决问题。希望本文能为您在 Spring Boot 开发过程中提供有效的指导和帮助。
2103 12
|
负载均衡 Dubbo Java
Spring Cloud Alibaba与Spring Cloud区别和联系?
Spring Cloud Alibaba与Spring Cloud区别和联系?
|
设计模式 缓存 前端开发
什么是幂等性?四种接口幂等性方案详解!
本文深入分布式系统中的幂等性问题及其解决方案,涵盖数据库唯一主键、乐观锁、PRG模式和防重Token等方法,关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
什么是幂等性?四种接口幂等性方案详解!