• MySQL事务


    MySQL事务是一个执行单元,在mysql中,对数据的一次操作或多次操作可以组合成一个事务,这些操作要么同时成功执行,要么同时失败。

    一、事务的性质

    事务有四个基本特性,通常被称为ACID属性。

    1. 原子性(Atomicity): 如果事务中的所有操作都成功,则事务被提交。如果事务中的任何操作失败,则事务被回滚到启动事务之前的状态。

    2. 一致性(Consistency): 数据库应始终从一个一致的状态转换到另一个一致的状态。

    3. 隔离性(Isolation): 并发执行的事务的修改必须被隔离。事务看到的数据必须与其他并发事务无关。

    4. 持久性(Durability): 一旦事务被提交,其结果就是永久性的,即使发生故障也能恢复。

    二、事务的基本操作

    在MySQL中,事务包括以下基本操作:

    • START TRANSACTION 开始一个新的事务
    • COMMIT 提交当前事务
    • ROLLBACK 回滚当前事务
    • SAVEPOINT 在当前事务内创建一个保存点,以便将事务回滚到该点而非整个事务
    • ROLLBACK TO SAVEPOINT 回滚到指定的SAVEPOINT
    • RELEASE SAVEPOINT 删除一个SAVEPOINT

    三、事务用例详解

    例1:使用 START TRANSACTION、COMMIT 和 ROLLBACK

    首先,我们创建一个表 orders

    CREATE TABLE orders (
        id INT PRIMARY KEY,
        product VARCHAR(50),
        quantity INT,
        price DECIMAL(5, 2)
    );
    

    然后,我们插入一些数据:

    INSERT INTO orders VALUES 
        (1, 'Apple', 10, 0.50),
        (2, 'Banana', 20, 0.25),
        (3, 'Orange', 15, 0.30);
    

    假设我们执行以下事务:

    START TRANSACTION;
    UPDATE orders SET quantity = quantity - 1 WHERE product = 'Apple';
    UPDATE orders SET quantity = quantity + 1 WHERE product = 'Orange';
    COMMIT;
    

    这个事务的目的是将'Apple'的数量减1,并将'Orange'的数量增1。当执行COMMIT操作时, 更改对所有其他用户都可见。如果这两个更新操作之一失败,如由于某些原因导致'Orange'无法增加数量,可以用ROLLBACK将事务回滚到最初的状态。

    例2:使用 SAVEPOINT 和 ROLLBACK TO SAVEPOINT

    让我们创建一个保存点并回滚到该点:

    START TRANSACTION;
    UPDATE orders SET quantity = quantity - 5 WHERE product = 'Banana';
    SAVEPOINT reduce_apple;
    UPDATE orders SET quantity = quantity - 5 WHERE product = 'Apple';
    -- 假设此时'Apple'的库存不能更低,我们需要回滚到SAVEPOINT
    ROLLBACK TO SAVEPOINT reduce_apple;
    UPDATE orders SET quantity = quantity + 5 WHERE product = 'Orange';
    COMMIT;
    

    在这个事务中,如果在减少'Apple'的数量时出现问题,我们可以将事务回滚到SAVEPOINT,然后尝试对'Orange'进行类似的操作。

    四、结束语

    适当理解和使用事务可以在保证数据完整性的同时,有效提高多用户场景下的数据并发处理能力。希望上述示例能帮助您更好地理解和使用MySQL事务。

    如果你有任何问题或者需要更深入的信息,非常欢迎你提问!


    __EOF__

  • 本文作者: welcome to mr.liao's blog
  • 本文链接: https://www.cnblogs.com/lyxlucky/p/17997975
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    MeterSphere离线部署操作手册
    用Intel MediaSDK 做超高码率编码
    Lru-k在Rust中的实现及源码解析
    python之pyttsx3库实现语音播报
    网页加载有哪些事件
    深度学习之 8 深度模型优化与正则化
    vuex 模拟异步调用
    Linux timedatectl控制系统时间和日期
    使用libzip压缩文件和文件夹
    JMeter的基本使用
  • 原文地址:https://www.cnblogs.com/lyxlucky/p/17997975