• 【Java 进阶篇】MySQL 事务详解


    在这里插入图片描述

    数据库管理中,事务是一组SQL语句的执行单元,它们被视为一个整体。事务的主要目标是保持数据库的一致性和完整性,即要么所有SQL语句都成功执行,要么所有SQL语句都不执行。在MySQL中,事务起到了非常重要的作用,特别是在需要确保数据的完整性和一致性的应用程序中。

    本文将详细介绍MySQL事务的概念、特性、隔离级别、事务的控制和示例代码等内容,以帮助您更好地理解和应用MySQL事务。

    1. 什么是事务?

    事务是一组SQL语句的有序执行集合,被视为一个不可分割的工作单元。它要么全部执行成功,要么全部失败回滚,保持数据库的一致性和完整性。事务是一种用于处理多个数据库操作的机制,常常应用于以下场景:

    • 银行转账:如果从一个账户扣除金额并将其存入另一个账户,必须确保两个操作都成功或都失败,以防止资金丢失。

    • 订单处理:在创建订单时,必须同时减少库存并增加销售记录,以保持库存和销售数据的一致性。

    • 预订系统:在预订机票或酒店时,需要同时锁定座位或房间并减少可用数量,以避免重复预订。

    2. 事务的特性(ACID)

    事务必须具备以下四个特性,通常称为ACID属性:

    2.1 原子性(Atomicity)

    原子性指事务是不可分割的工作单元,要么全部执行成功,要么全部失败回滚。如果一个事务包含多个操作,其中任何一个操作失败,整个事务都应该被回滚,以保持数据库的一致性。

    2.2 一致性(Consistency)

    一致性确保在事务开始和结束时数据库的完整性不被破坏。事务执行后,数据库应该处于一种一致的状态,即满足所有约束和规则。

    2.3 隔离性(Isolation)

    隔离性指多个事务并发执行时,每个事务都应该感觉自己在独立地操作数据库,即一个事务的执行不应该影响其他事务的执行。MySQL提供了多个隔离级别,用于控制事务之间的可见性。

    2.4 持久性(Durability)

    持久性确保一旦事务提交,其结果将永久保存在数据库中,即使发生系统故障也不会丢失。

    3. 事务的隔离级别

    MySQL支持多个事务隔离级别,以控制不同事务之间的可见性。隔离级别从低到高分别为:

    3.1 读未提交(Read Uncommitted)

    在这个级别下,事务可以读取其他事务尚未提交的数据。这是最低的隔离级别,不提供任何隔离性。

    3.2 读已提交(Read Committed)

    在这个级别下,事务只能读取已提交的数据。其他事务正在执行的数据对当前事务是不可见的。这是MySQL默认的隔离级别。

    3.3 可重复读(Repeatable Read)

    在这个级别下,事务可以读取其他事务已提交的数据,但其他事务正在执行的数据对当前事务是不可见的。这个级别保证了事务在执行期间看到的数据保持一致,不会发生读取到脏数据或不可重复读的情况。但是,它仍然允许出现幻读的情况。

    3.4 串行化(Serializable)

    在这个级别下,事务是串行执行的,不允许并发执行。这提供了最高级别的隔离性,但可能会降低性能。

    4. 事务的控制

    在MySQL中,您可以使用以下SQL语句来控制事务的开始、提交和回滚:

    4.1 开始事务

    要开始一个事务,使用START TRANSACTIONBEGIN语句:

    START TRANSACTION; -- 或者使用 BEGIN;
    
    • 1

    4.2 提交事务

    要提交一个事务,使用COMMIT语句:

    COMMIT;
    
    • 1

    提交事务将使所有更改永久保存到数据库。

    4.3 回滚事务

    要回滚一个事务,使用ROLLBACK语句:

    ROLLBACK;
    
    • 1

    回滚事务将撤销所有未提交的更改。

    5. 事务的示例

    下面是一个简单的示例,演示如何在MySQL中执行事务。

    假设有一个银行数据库,包含了两个表:accounts用于存储账户信息,transactions用于存储交易记录。我们想要执行一个事务,从一个账户扣除金额并将其存入另一个账户。

    -- 开始事务
    START TRANSACTION;
    
    -- 扣除金额
    UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
    
    -- 增加金额
    UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
    
    -- 提交事务
    COMMIT;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在上面的示例中,事务首先开始,然后执行两个UPDATE语句,一个是扣除金额,另一个是增加金额,最后通过COMMIT语句提交事务。

    如果在执行这个事务期间发生了错误,可以使用ROLLBACK语句来回滚事务,以确保不会影响数据库的一致性和完整性。

    6. 总结

    事务是数据库管理中的重要概念,用于确保数据的一致性和完整性。MySQL提供了不同的事务隔离级别,以满足不同应用程序的需求。通过控制事务的开始、提交和回滚,可以有效地管理数据库操作。理解和使用事务是编写可靠和高性能的数据库应用程序的关键一步。希望本文能帮助您更好地理解MySQL事务的概念和使用。

    作者信息

    作者 : 繁依Fanyi
    CSDN: https://techfanyi.blog.csdn.net
    掘金:https://juejin.cn/user/4154386571867191
  • 相关阅读:
    TCP/IP协议栈各层涉及到的协议
    Python读写文件操作
    R语言用标准最小二乘OLS,广义相加模型GAM ,样条函数进行逻辑回归LOGISTIC分类...
    VLAN实验
    Xilinx FPGA 程序固化重新上电程序不运行的问题
    QT学习日记28——QT动态库制作和使用
    数据结构(四)--队列及面试常考的算法
    七千字带你了解异常处理
    Linux中SSHD_CONFIG文件详细注解,便于配置
    python学习之【包和内置模块】
  • 原文地址:https://blog.csdn.net/qq_21484461/article/details/133443999