MySQL事务执行全步骤解析
mysql事务执行步骤

首页 2025-06-15 23:20:59



MySQL事务执行步骤深度解析 事务是数据库区别于文件系统的重要特性之一,它确保了数据库操作的一致性和可靠性

    在MySQL中,事务的执行步骤涉及多个关键环节,包括事务的开启、执行、提交或回滚等

    本文将详细阐述MySQL事务的执行步骤,并深入探讨事务的四大特性(ACID)以及它们在执行过程中的作用

     一、事务的基本概念 事务(Transaction)是一组逻辑操作单元,它使数据从一种状态变换到另一种状态

    事务处理的原则是保证所有事务都作为一个工作单元来执行,即使出现了故障,也不能改变这种执行方式

    换句话说,事务中的操作要么全部成功,要么全部失败,这是事务原子性的体现

     在MySQL中,事务通常由BEGIN或START TRANSACTION语句显式开启,通过COMMIT语句提交,或通过ROLLBACK语句回滚

    值得注意的是,MySQL默认不开启事务,需要手动启动

    此外,MySQL中的存储引擎对事务的支持也有所不同,目前只有InnoDB存储引擎支持事务

     二、事务的执行步骤 1. 开启事务 在MySQL中,可以使用BEGIN、START TRANSACTION或START TRANSACTION READ ONLY等语句来显式开启一个事务

    BEGIN和START TRANSACTION语句在功能上是等价的,但START TRANSACTION语句后面可以跟随一些修饰符,如READ ONLY(标识当前事务是一个只读事务)和READ WRITE(默认,标识当前事务是一个读写事务)

     例如: BEGIN; -- 或者 START TRANSACTION; 开启事务后,MySQL会关闭自动提交功能,这意味着在事务提交之前,所有的数据修改都不会被永久保存到数据库中

     2. 执行事务中的操作 在事务开启后,可以执行一系列的数据操作语句(主要是DML语句,不包括DDL语句)

    这些操作语句会按照事务的原子性要求执行,即要么全部成功,要么全部失败

     例如,在一个银行转账事务中,可能会包含两个更新操作:一个是从A账户扣款,另一个是向B账户存款

    这两个操作必须作为一个整体来执行,以确保转账的一致性和完整性

     3. 提交事务或回滚事务 当事务中的所有操作都执行完毕后,需要根据执行结果来决定是提交事务还是回滚事务

     - 提交事务:使用COMMIT语句来提交事务

    提交事务后,事务中的所有修改都会被永久保存到数据库中,并且其他事务可以看到这些修改

     例如: COMMIT; - 回滚事务:如果事务中的某个操作失败或者需要取消事务,可以使用ROLLBACK语句来回滚事务

    回滚事务后,事务中的所有修改都会被撤销,数据库会恢复到事务开始之前的状态

     例如: ROLLBACK; 此外,MySQL还支持在事务中创建保存点(SAVEPOINT),以便在需要时可以将事务回滚到某个特定的保存点

    这可以通过SAVEPOINT语句来创建保存点,通过ROLLBACK TO SAVEPOINT语句来回滚到指定的保存点

     例如: SAVEPOINT savepoint_name; -- 执行一些操作后 ROLLBACK TO SAVEPOINT savepoint_name; 三、事务的四大特性(ACID) 事务的四大特性(ACID)是确保事务可靠性和一致性的关键

    它们分别是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)

     1. 原子性(Atomicity) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么全部成功,要么全部失败回滚

    这是通过undo log来实现的

    当事务对数据库进行修改时,InnoDB会生成对应的undo log日志

    如果事务执行失败或者调用rollback,导致事务回滚,便可以利用undo log中的信息将数据回滚到修改之前的样子

     例如,在一个转账事务中,如果从A账户扣款成功但向B账户存款失败,那么整个事务就会回滚,A账户的扣款操作也会被撤销

     2. 一致性(Consistency) 一致性是指事务执行前后,数据从一个合法性状态变换到另外一个合法性状态

    这种状态是语义上的而不是语法上的,跟具体的业务有关

    满足预定的约束的状态就叫做合法的状态

    如果事务中的某个操作失败了,系统就会自动撤销当前正在执行的事务,返回到事务操作之前的状态

     例如,在转账事务中,转账前后的账户余额之和应该保持不变

    如果因为某种原因转账失败,那么账户余额应该恢复到转账之前的状态

     3. 隔离性(Isolation) 隔离性是指一个事务的执行不被其他事务干扰

    即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰

    MySQL提供了四种事务隔离级别来控制事务的隔离性:READ UNCOMMITTED(读未提交)、READ COMMITTED(读已提交)、REPEATABLE READ(可重复读)和SERIALIZABLE(可串行化)

     - READ UNCOMMITTED:允许事务读取其他未提交事务的数据,可能会发生脏读

     - READ COMMITTED:只能读取已经提交的数据,避免了脏读,但可能会发生不可重复读

     - REPEATABLE READ:保证在一个事务中多次读取同一数据时结果始终一致,避免了不可重复读,但仍然可能会发生幻读(通过间隙锁机制可以解决)

    这是MySQL InnoDB存储引擎的默认隔离级别

     - SERIALIZABLE:强制事务串行执行,完全避免脏读、不可重复读和幻读,但性能会较低

     例如,在REPEATABLE READ隔离级别下,一个事务在第一次读取某条数据后,即使其他事务对该数据进行了修改并提交,该事务再次读取该数据时得到的结果仍然是第一次读取时的结果

     4. 持久性(Durability) 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的

    即使系统崩溃或者发生其他故障,这些修改也不会丢失

    这是通过redo log来实现的

    当事务对数据库进行修改时,这些修改会首先被记录到redo log中,然后再更新到数据库中

    如果系统崩溃或者发生故障,重启后可以根据redo log中的记录来恢复数据

     例如,在一个转账事务中,当从A账户扣款并向B账户存款的操作都成功并提交后,即使系统崩溃或者发生故障,这些修改也不会丢失,因为它们已经被永久地保存到数据库中

     四、事务执行过程中的关键机制 在MySQL事务执行过程中,有几个关键机制起着至关重要的作用

    它们是undo log、redo log、锁和MVCC

     1. undo log undo log用于保证事务的原子性和一致性

    当事务对数据库进行修改时,InnoDB会生成对应的undo log日志

    如果事务执行失败或者调用rollback导致事务回滚时,可以利用undo log中的信息将数据回滚到修改之前的样子

    undo log是逻辑日志,记录的是SQL执行相关的信息

    当发生回滚时,InnoDB会根据undo log的内容做与之前相反的工作

     2. redo log redo log用于保证事务的持久性和原子性

    在MySQL中,当事务对数据库进行修改时,这些修改会首先被记录到redo log中(称为“写前日志”或WAL),然后再更新到数据库中

    如果系统崩溃或者发生故障导致事务未能提交但已经写入了redo log中的修改信息,则重启后可以根据redo log中的记录来恢复数据

    此外,在事务回滚时也需要利用redo log来撤销已经提交但尚未持久化到数据库中的修改(这部分修改实际上是在内存中的Buffer Pool中进行的异步刷新操作)

    因此可以说redo log既保证了事务的持久性也参与了事务的原子性实现过程(通过回滚操作)

    但需要注意的是:redo log记录的是页的物理修改操作(即数据页的物理变化),而undo log记录的是数据的逻辑变化(即SQL执行相关的信息)

     3. 锁机制 锁机制是实现事务隔离性的关键手段之一

    在MySQL中,锁可以分为表级锁和行级锁两种类型:MyISAM存储引擎默认使用表级锁;InnoDB存储引擎默认使用行级锁(但也支持表级锁)

    行级锁可以减小锁粒度提高并发性能但也可能导致死锁问题;表级锁虽然锁粒度较大但实现起来相对简单且不容易导致死锁问题

    此外,在InnoDB存储引擎中还可以使用乐观锁和悲观锁等高级锁机制来控制并发访问和避免数据冲突问题

    但需要注意的是:乐观锁通常不是数据库自带的功能而是需要通过应用程序自己来实现;悲观锁则会在整个数据处理过程中将数据处于锁定状态以防止其他事务进行并发修改操作

    

MySQL连接就这么简单!本地远程、编程语言连接方法一网打尽
还在为MySQL日期计算头疼?这份加一天操作指南能解决90%问题
MySQL日志到底在哪里?Linux/Windows/macOS全平台查找方法在此
MySQL数据库管理工具全景评测:从Workbench到DBeaver的技术选型指南
MySQL密码忘了怎么办?这份重置指南能救急,Windows/Linux/Mac都适用
你的MySQL为什么经常卡死?可能是锁表在作怪!快速排查方法在此
MySQL单表卡爆怎么办?从策略到实战,一文掌握「分表」救命技巧
清空MySQL数据表千万别用错!DELETE和TRUNCATE这个区别可能导致重大事故
你的MySQL中文排序一团糟?记住这几点,轻松实现准确拼音排序!
别再混淆Hive和MySQL了!读懂它们的天壤之别,才算摸到大数据的门道