• MySQL-事务


    MySQL-事务

    1.什么是事务

    举例:想象炒菜的过程。

    1. 洗菜
    2. 切菜
    3. 炒菜
    4. 装盘

    我相信缺少任何任何一个步骤,都不完美!!!可以将炒菜的过程理解为一个事务,是一组操作的集合,而MySQL中的事务也是如此。但在MySQL中定义了事务的一些特性。只有符合这些特征才能称之为MySQL事务,它们保证了数据库在并发环境下的正确性和可靠性。

    2.事务的特性

    1.1原子性

    在MySQL中事务像原子一样不可分割的,要么都执成功,要么都执行失败。事务中的SQL语句执行错误,已经执行的SQL语句必须撤销,回滚到事务执行之前的状态。

    1.2一致性

    指的是事务开始和结束前后,数据库的完整性没有被破坏。(例如转账前后双方的金额和是不会发生变化的,保持一致)

    1.3持久性

    事务一旦提交,其执行的结果将持久化到数据库,即使系统宕机也能恢复。

    1.4.隔离性

    表示多个事务可以同时执行,互相隔离。

    3.事务的分类

    保存点:保存点(Savepoint)是事务过程中的一个中间状态,它可以在事务执行过程中被创建和命名。保存点允许事务回滚到某一状态。

    3.1扁平事务

    使用最频繁的事务,存在一个隐式的保存点,有且仅有这一个隐式保存点,在开始事务时隐式创建的保存点。当然,我们也可以在事务中自定义保存点。

    -- 创建一个保存点
    SAVEPOINT save_point_name;
    -- 删除某个一保存点
    release savepoint point_name;
    -- 回滚到某一个保存点
    ROLLBACK TO save_point_name;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    例如:对商品表进行第一次修改,设置保存点,进行第二次修改,回滚到设置的保存点,然后提交。

    -- 商品表如下
    +-------+------------------+------+-----+---------+----------------+
    | Field | Type             | Null | Key | Default | Extra          |
    +-------+------------------+------+-----+---------+----------------+
    | id    | int(11)          | NO   | PRI | NULL    | auto_increment |
    | name  | varchar(32)      | NO   |     | NULL    |                |
    | count | int(10) unsigned | YES  |     | NULL    |                |
    +-------+------------------+------+-----+---------+----------------+
    
    begin;
    update product set count = 2500 where id = 1;
    savepoint p1;
    -- 该条数据被回滚,修改不生效
    update product set count = 2000  where id = 1;
    rollback to p1;
    commit;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    扁平事务保存点的易失性:带有保存点的扁平事务发生系统崩溃故障时,保存点会消失,一旦保存消失,只能恢复到事务最开始的状态。

    注意:rollback不指定回滚的保存点,将默认回滚到隐式保存点。

    3.2链事务

    链事务的本质是开启多个事务,它们是独立提交的且处于同一层级,提交一个事务时,释放不需要的数据对象。在提交事务和开始下一个事务操作会合并成一个原子操作,下一个事务可以看见上一个事务的执行结果。

    commit和commit work的区别:

    complection_type:设 set @@completion_type=1;

    1. complection_type=0,commit和commit work是一样的效果,提交事务。
    2. complection_type=1,执行commit work/commit后会自动开启一个相同隔离级别的事务。
    3. complection_type=2,commit work/commit等同于commit and release,事务提交后断开与服务器的连接并重新开启一个会话。

    3.3嵌套事务

    嵌套事务本质上也是多个事务嵌套执行,由最外层的事务控制内层事务。内层事务也可以嵌套其他事务。可以看做它们是树形的具有父子关系。子事务可以提交也可以回滚,回滚不会影响父事务,只会影响当前事务,但是提交操作不会立即生效,需要最后和父事务同时提交。

    4.事务的实现

    1.redo

    主要功能:实现事务的持久性。

    记录物理级别上的页修改,当事务提交时,必须先将事务的所有日志写入到redo日志文件进行持久化。

    数据库存储数据的位置位于磁盘,想要知道磁盘的内容我们需要将其加载到内存,在内存中读取和操作数据。数据库对数据进行更改时,需要将数据页加载到buffer pool(缓存池),在buffer pool中更改数据,当buffer pool中的数据还没有同步到磁盘,就会暂时和磁盘页的内容不一致,这些未同步的数据页,通常称之为脏页(dirty page)。如果出现数据库崩溃或者是宕机,这些脏页的数据丢失,从而失去了持久性。因此数据库需要一种机制来记录对数据的修改。即使数据发生故障也能进行恢复。

    redo实现日志持久化的原理:事务将这些修改操作写入redo log buffer,准备提交事务时。系统会将redo log buffer中的修改操作写入redo log file。

    2.undo

    undo日志通过记录数据的历史版本和撤销操作信息,方便数据进行回滚。

    undo是逻辑日志,当发生回滚时,所有的修改都被逻辑取消了。InnoDB存储引擎回滚时,它实际上做的是与之前相反的工作,例如插入操作,Innodb存储引擎会完成一个delete;删除操作,InnoDB存储引擎会执行一个insert操作;update操作,Innodb存储引擎会执行一个相反的update操作。

    5.事务管理器

    InnoDB的事务管理器是InnoDB数据库引擎的核心组件之一,它负责协调和管理数据库事务的处理。

    在MySQL中,事务中对数据的锁定都是由事务管理器来管理的。当一个事务获取了对某一行的锁时,该锁将一直保持有效,直到事务结束(提交或回滚)才会被释放。

    在事务执行期间,如果其他事务尝试获取同一行的锁,它将被阻塞,直到当前事务释放对该行的锁为止。这样可以确保在一个事务执行期间,其他事务无法修改该行,从而保持了数据的一致性。

    在事务提交或回滚时,事务管理器将释放所有该事务所获取的锁。这样,其他事务就可以获取这些锁并对数据进行修改。如果事务被回滚,那么它对数据的修改将被撤销,同时对数据的锁定也将被释放。

  • 相关阅读:
    开发日志打印
    【日积月累】后端刷题日志
    python正则+多线程(代理)+线程池+协程
    ArrayList 可以完全替代数组吗?
    c++小学生入门课程(一)
    Dynamodb 备份方案
    GoLang核心知识点
    dll缺失怎么修复?有什么好的修复方法推荐?
    小迪安全39WEB 攻防-通用漏洞&CSRF&SSRF&协议玩法&内网探针&漏洞利用
    大学生《Web课程谁》期末网页制作 HTML+CSS+JavaScript 网页设计实例 瑜伽网站企业网站制作
  • 原文地址:https://blog.csdn.net/qq_52763385/article/details/133688563