• 聊聊 mysql 事务?(一)


    一、什么是事务

            事务 transaction 是一个抽象的概念,其实就是一组操作集合。mysql 不是所有存储引擎都支持事务,只有 InnoDB 和 NDB 支持(下文忽略)。

    • 自动提交

            InnoDB默认开启自动提交事务,我们可以通过下列语句查看:

    SHOW VARIABLES LIKE 'autocommit';

       ​

            自动提交的默认值为ON,就是说默认情况下,如果不显示声明开启事务,那么每次执行SQL语句都算一次事务,MYSQL帮我们自动提交了。比如下面2条语句,算2次事务:

    1. UPDATE ... SET field=XXX WHERE ..
    2. DELETE ... FROM ... WHERE ...

            我们可以通过下列语句显式开启事务:

    1. -- 第一种:
    2. START TRANSACTION
    3. -- 第二种:WORK 可省略
    4. BEGIN [WORK]

            两种语句的效果一致,只不过START TRANSACTION可以加限定条件,有兴趣的自行查下资料。开启显式事务后,在本次事务提交或者回滚前会暂时关闭自动提交的功能。

    1. -- 回滚到事务开始前或回滚到事务保存点
    2. ROLLBACK [WORK] TO [SAVAPOINT]
    3. -- 提交事务
    4. COMMIT;

            需要特别注意隐式提交,即某些语句会导致之前的事务悄悄提交掉,就像输入了COMMIT语句一样,这显然不是我们希望的。大家可以查下资料,网上有很多。
     

    二、事务的特性

    我们希望事务具有下列特性:

    • 原子性(Acid):要么都成功,要么都失败,并且失败后要回滚到原始状态。
    • 隔离性(Isoland):多个事务之间的状态转换互不影响。
    • 一致性(Consistency):指的是数据库中的数据符合现实世界的约束规则,比如现实世界中,人的体重不可能为负数,假设数据库中体重的字段为weight,那么如果weight>0,那么我们可以说这个数据是符合一致性的,数据库能为我们解决一部分一致性,比如UNIQUE,可以帮我们做唯一性限制,但是更多情况下一致性规则由程序员控制。
    • 持久性(Durability):指事务执行成功后,结果永久保留。

    三、事务的状态

    根据事务执行的不同阶段,可以大致划分为下列几种状态

    • 活动的 active :事务正在执行中时。
    • 预提交的 precommit:事务二阶段提交的第一阶段时,此时事务未真正执行成功。
    • 提交的 commit:事务提交成功,刷新到磁盘后。 
    • 失败的 fail:事务因错误或手动停止。
    • 中止的 abort:事务回滚后。
  • 相关阅读:
    如何在Puppeteer中设置User-Agent来绕过京东的反爬虫机制?
    【无标题】
    spring 事务源码阅读
    dreamweaver作业静态HTML网页设计——家乡海南旅游网站
    Mybatis-Plus【吐血详解 一篇掌握】
    领域驱动设计
    PyFluent入门之旅(2)基本操作
    小米12sultra支持ip68级防水吗 小米12sultra有光学变焦吗
    向量数据库Weaviate Cloud 和 Milvus Cloud:性能大比拼
    FreeRTOS 任务的创建与删除
  • 原文地址:https://blog.csdn.net/weixin_40647516/article/details/126905100