Spring事务管理

Spring事务管理

事务的特性(面试题)

事务的四大特性

  1. 原子性

    • 在事务中的所有操作被视为一个不可分割的整体,要么全部执行成功,要么全部不执行。
  2. 一致性

    • 事务必须确保数据库从一个一致性的状态转换到另一个一致性的状态。例如,在转账场景中,转账前后两个账户的总金额保持不变。
  3. 隔离性

    • 多个并发事务之间相互独立,互不影响。即使多个用户同时访问数据库,每个事务看到的数据都像只有自己在进行操作一样。
  4. 持久性

    • 当事务被提交后,对数据库的修改是永久性的,即使系统出现故障也不会丢失所做的更改。

image.png

事务的隔离级别

  • 脏读

    • 一个事务读取到了另一个事务未提交的数据。
  • 不可重复读

    • 在同一个事务内多次读取同一数据时,结果可能会因为其他事务对该数据的修改而不同。
  • 虚读(幻读)

    • 在同一个事务内,前后两次查询的结果集中出现了其他事务插入的新行,导致前后查询结果不一致。

隔离级别的分类:

  • READ UNCOMMITTED

    • 允许脏读、不可重复读和虚读的发生。
  • READ COMMITTED

    • 可以避免脏读,但不可重复读和虚读仍可能发生。(Oracle默认隔离级别)
  • REPEATABLE READ

    • 避免了脏读和不可重复读,但仍可能出现虚读问题。(MySQL默认隔离级别)
  • SERIALIZABLE

    • 最高的隔离级别,可以避免所有的脏读、不可重复读和虚读,但可能牺牲一定的并发性能。

注:隔离级别越高,安全性越强,但可能导致并发性能下降。

image.png

MySQL 中的事务操作 - Savepoint(保存点)

在事务中使用 Savepoint 的示例:

// 需求:操作 AB 必须完成,CD 是可选的
Connection conn = null;
Savepoint savepoint = null; // 记录操作的当前位置,可用于回滚至指定位置

try {
    // 1. 获取连接
    conn = ...;

    // 2. 开启事务并设置自动提交为 false
    conn.setAutoCommit(false);

    // A 操作
    ...

    // B 操作
    ...

    // 设置保存点
    savepoint = conn.setSavepoint();

    // C 操作
    ...

    // D 操作
    ...

    // 3. 提交整个事务
    conn.commit();
} catch (Exception e) {
    if (savepoint != null) {
        // CD 部分发生异常
        // 回滚至保存点(即CD之前的操作)
        conn.rollback(savepoint);

        // 提交AB部分的事务
        conn.commit();
    } else {
        // AB 部分发生异常
        // 回滚整个事务
        conn.rollback();
    }
} finally {
    // 不论是否发生异常,都要关闭连接或恢复其初始状态
    // ...
}

事务的传播行为

propagation【传播行为】:在两个业务之间如何共享事务。7种
PROPAGATION_REQUIRED required【必须,默认值】 支持当前事务,A如果有事务,B将使用该事务。
PROPAGATION_SUPPORTS Supports【支持】 支持当前事务,A如果有事务,B将使用该事务。
PROPAGATION_MANDATORY mandatory【强制】 支持当前事务,A如果有事务,B将使用该事务。
PROPAGATION_REQUIRES_NEW requires_new【必须新的】 如果A有事务,将A的事务挂起,B创建一个新的事务
PROPAGATION_NOT_SUPPORTED not_supported【不支持】 如果A有事务,将A的事务挂起,B将以非事务执行
PROPAGATION_NEVER never【从不】 如果A有事务,B将抛异常
PROPAGATION_NESTED nested 【嵌套】 A和B底层采用保存点机制,形成嵌套事务
掌握:PROPAGATION_REQUIRED、PROPAGATION_REQUIRES_NEW、PROPAGATION_NESTED

注意:在实际应用中,务必正确处理资源释放,确保连接能够最终关闭或还原回原始状态。上述代码片段中省略了finally块中的资源清理部分。

原文链接 https://www.hanyuanhun.cn | https://node.hanyuanhun.cn

posted @   汉源魂  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示