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

简介: 本文介绍了事务的七种传播行为及其应用场景,包括 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>
    )


相关文章
|
1月前
|
消息中间件 NoSQL Java
延时实现
本节介绍了多种关闭过期订单的实现方案,包括定时任务、JDK延迟队列、Redis过期监听、Redisson延迟队列、RocketMQ延迟消息及RabbitMQ死信队列。各自优缺点明显,适用于不同业务场景,如定时任务适合小数据量,RocketMQ适合高并发解耦场景,而Redisson则使用简单且高效。选择时需综合考虑系统复杂度、数据量及可靠性要求。
|
1月前
|
Cloud Native 测试技术 开发者
云原生 LFX Mentorship 招募中:开源影响力与丰厚报酬兼得,开发者不容错过!
参与其中的开发者不仅有机会在经验丰富的社区 Mentor 指导下贡献开源项目、为职业生涯加分,完成课题后还能获得丰厚酬劳。
|
1月前
|
XML Java Maven
@Bean`注解的使用方法及其作用
本文介绍了Spring框架中`@Bean`注解的使用方法及其作用,包括如何将第三方类库加入Spring容器,配置类与`@Configuration`的配合使用,以及通过`@ConditionalOnClass`、`@ConditionalOnMissingBean`等条件注解控制Bean的加载。同时讲解了Maven父子模块间的依赖关系及配置方式,帮助开发者更好地管理项目结构与依赖注入。
|
1月前
|
Kubernetes 安全 Devops
「迁移急救包」全云平台无缝迁移云效实操手册
阿里云云效是国内领先的一站式DevOps平台,提供代码全生命周期管理、智能化交付流水线及精细化研发管控,支持多种开发场景。本文详细介绍了从其他平台(如Coding)向云效迁移的完整方案,包括代码仓库、流水线、制品仓库及项目数据的迁移步骤,帮助用户实现高效、安全的平滑迁移,提升研发效率与协作能力。
367 29
|
1月前
|
SQL 人工智能 JSON
Flink 2.1 SQL:解锁实时数据与AI集成,实现可扩展流处理
简介:本文整理自阿里云高级技术专家李麟在Flink Forward Asia 2025新加坡站的分享,介绍了Flink 2.1 SQL在实时数据处理与AI融合方面的关键进展,包括AI函数集成、Join优化及未来发展方向,助力构建高效实时AI管道。
451 43
|
1月前
|
文字识别 算法 语音技术
基于模型蒸馏的大模型文案生成最佳实践
本文介绍了基于模型蒸馏技术优化大语言模型在文案生成中的应用。针对大模型资源消耗高、部署困难的问题,采用EasyDistill算法框架与PAI产品,通过SFT和DPO算法将知识从大型教师模型迁移至轻量级学生模型,在保证生成质量的同时显著降低计算成本。内容涵盖教师模型部署、训练数据构建及学生模型蒸馏优化全过程,助力企业在资源受限场景下实现高效文案生成,提升用户体验与业务增长。
322 23
|
1月前
|
存储 算法 Sentinel
熔断降级
本内容介绍了微服务中熔断降级的实现原理及Sentinel的底层机制。通过OpenFeign集成Sentinel,利用断路器统计异常和慢请求比例,触发熔断并降级,提升系统稳定性。还讲解了Sentinel使用的限流算法,如滑动窗口、令牌桶和漏桶算法,以应对不同场景下的流量控制需求。
|
1月前
|
XML JSON Java
Spring框架中常见注解的使用规则与最佳实践
本文介绍了Spring框架中常见注解的使用规则与最佳实践,重点对比了URL参数与表单参数的区别,并详细说明了@RequestParam、@PathVariable、@RequestBody等注解的应用场景。同时通过表格和案例分析,帮助开发者正确选择参数绑定方式,避免常见误区,提升代码的可读性与安全性。
机器学习/深度学习 人工智能 中间件
213 26