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

简介: 本文介绍了事务的七种传播行为及其应用场景,包括 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看这一篇就够了,建议收藏
26401 2
|
缓存 Java 应用服务中间件
Tomcat是如何打破"双亲委派"机制的?
上文我们详细了解了类加载以及什么是双亲委派机制,相信很多童鞋都了解Tomcat打破了双亲委派机制,本文将对Tomcat为什么要打破双亲委派机制,以及Tomcat是如何打破双亲委派机制的,进行完整性的复盘与解析。
4335 0
Tomcat是如何打破"双亲委派"机制的?
|
12月前
|
SQL 缓存 Java
【Java架构必看】Mybatis的工作原理
MyBatis执行分启动与运行两阶段:启动时加载配置,运行时代理执行SQL。通过JDK动态代理生成Mapper接口,结合缓存机制与Executor执行SQL,最终由TypeHandler完成结果映射。
646 4
|
关系型数据库 MySQL 数据库
什么是事务以及事务的四大特性?
事务是数据库操作的基本单元,具有ACID四大特性:原子性、一致性、隔离性、持久性。它确保数据的正确性与完整性。并发事务可能引发脏读、不可重复读、幻读等问题,数据库通过不同隔离级别(如读未提交、读已提交、可重复读、串行化)加以解决。MySQL默认使用可重复读级别,兼顾性能与数据一致性需求。
740 3
|
Java 存储
线程池的核心参数有哪些?
线程池七大核心参数:核心/最大线程数、线程保持时间及单位、阻塞队列、线程工厂与拒绝策略。
1881 79
|
缓存 监控 负载均衡
将近2万字的Dubbo原理解析,彻底搞懂dubbo
市面上有很多基于RPC思想实现的框架,比如有Dubbo。今天就从Dubbo的SPI机制、服务注册与发现源码及网络通信过程去深入剖析下Dubbo。
31154 9
|
安全 Java
ConcurrentHashMap是如何保证线程安全的
总的来说,ConcurrentHashMap通过分段锁和红黑树等策略,实现了既能保证线程安全,又能保持高并发性能的特性。
596 1
|
SQL 存储 大数据
Flink 基础详解:大数据处理的强大引擎
Apache Flink 是一个分布式流批一体化的开源平台,专为大规模数据处理设计。它支持实时流处理和批处理,具有高吞吐量、低延迟特性。Flink 提供统一的编程抽象,简化大数据应用开发,并在流处理方面表现卓越,广泛应用于实时监控、金融交易分析等场景。其架构包括 JobManager、TaskManager 和 Client,支持并行度、水位线、时间语义等基础属性。Flink 还提供了丰富的算子、状态管理和容错机制,如检查点和 Savepoint,确保作业的可靠性和一致性。此外,Flink 支持 SQL 查询和 CDC 功能,实现实时数据捕获与同步,广泛应用于数据仓库和实时数据分析领域。
11884 42
|
SQL Java 数据库连接
MyBatis的配置文件中定义类型别名(type aliases)的技巧。
类型别名提供了一种便捷的方式来引用复杂的全限定类名。通过使用 `<package>`标签进行自动扫描或使用 `<typeAlias>`标签手动指定,可以在整个MyBatis配置中提高清晰度和维护性。无论是简化mapper文件中的配置,还是提高整体的配置可读性,类型别名都是一个非常有用的配置工具。
517 0