详解MySQL中的事务与ACID特性

 更新时间:2023年05月24日 10:13:52   作者:蜀山剑客李沐白  
这篇文章主要为大家介绍了Mysql 中的事务,包括事务的基本概念和 ACID 特性、事务的隔离级别和具体实现方法等,并提供相应的代码示例,希望对大家有所帮助

一、介绍

事务是数据库中的一个非常重要的概念,它是指由一系列操作所组成的逻辑单位,在这个单位内,要么所有操作都成功完成,要么所有操作都不会执行。Mysql 中使用事务来保证数据的完整性和一致性,同时也是实现高并发的关键。

本文将全面详细地讲解 Mysql 中的事务,包括事务的基本概念和 ACID 特性、事务的隔离级别和具体实现方法等,并提供相应的代码示例。

二、ACID 特性

在讲解事务的具体实现方法之前,我们先来了解一下 ACID 特性。ACID 是对事务的四个特性的概括,分别为:

  • 原子性(Atomicity):事务是一个原子操作单元,它要么全部执行成功,要么全部回滚。
  • 一致性(Consistency):事务在执行前后,数据库中的数据必须保持一致性状态。
  • 隔离性(Isolation):事务的执行应该与其他事务相互独立,即不会相互干扰。
  • 持久性(Durability):事务执行成功后,所有的变更必须永久保存到数据库中。

Mysql 中默认支持 ACID 特性,并且可以通过修改数据库配置文件的方式来调整事务的隔离级别,以满足不同的业务需求。

三、事务的隔离级别

在 Mysql 中,事务支持四种隔离级别,分别为:

  • 读未提交(read uncommitted):一个事务可以读取另一个事务未提交的数据,这种隔离级别最低,会导致脏读。
  • 读已提交(read committed):一个事务只能读取另一个事务已经提交的数据,避免脏读问题,但可能会出现不可重复读的情况。
  • 可重复读(repeatable read):确保同一事务内多次读取同一数据时,结果始终相同,也就是可以避免不可重复读的问题。
  • 序列化(serializable):最高的隔离级别,强制事务串行执行,从而避免了幽灵读和不可重复读的情况,但会有较高的性能开销。

可以通过 SET TRANSACTION ISOLATION LEVEL 命令来设置当前会话的事务隔离级别,例如:

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

这将设置当前会话的事务隔离级别为读已提交。

四、事务的实现方法

Mysql 中的事务是使用 BEGIN、COMMIT 和 ROLLBACK 三个命令来完成的。

1.BEGIN

BEGIN 命令用于开启一个新的事务,将当前会话标记为一个事务。例如:

BEGIN;

2.  COMMIT

COMMIT 命令用于提交当前的事务,将所有变更保存到数据库中。如果一个事务被成功地提交,那么其中的所有操作都将被永久保存到数据库。例如:

COMMIT;

3.  ROLLBACK

ROLLBACK 命令用于撤销当前的事务,回滚到事务开始之前的状态。如果一个事务执行失败或者出现异常,那么其中的所有操作都将被自动回滚。例如:

ROLLBACK;

下面是一个简单的 Mysql 事务示例,该事务将从 users 表中删除所有性别为女性的记录:

BEGIN;
DELETE FROM users WHERE gender = 'female';
COMMIT;

在这个示例中,先使用 BEGIN 命令开启一个新的事务,并在其中执行了一个 DELETE 操作。如果这个操作执行成功,那么就可以执行 COMMIT 命令来提交事务,否则就可以使用 ROLLBACK 命令来回滚事务。

五、事务的嵌套和保存点

Mysql 还支持事务的嵌套和保存点。

1.事务的嵌套

事务的嵌套指的是在一个事务中嵌套另一个事务,这样可以将复杂的操作分解为多个更小的操作,便于管理和维护。例如:

BEGIN;
-- 在当前事务中开启一个嵌套事务
SAVEPOINT savepoint1;
UPDATE users SET gender = 'male' WHERE id = 1;
-- 回滚到保存点,并撤销嵌套事务的变更
ROLLBACK TO SAVEPOINT savepoint1;
COMMIT;

在这个示例中,先使用 BEGIN 命令开启一个新的事务,然后使用 SAVEPOINT 命令在其中开启一个嵌套事务。在嵌套事务中执行了一个 UPDATE 操作,但是在之后使用 ROLLBACK TO 命令回滚到了保存点,撤销了嵌套事务的变更。最后使用 COMMIT 命令提交了整个事务。

2.保存点

Mysql 中的保存点用于标记一个事务中的特定位置,可以在该位置处回滚事务的部分操作或者全部操作。例如:

BEGIN;
-- 在当前事务中创建一个保存点
SAVEPOINT savepoint1;
UPDATE users SET gender = 'male' WHERE id = 1;
-- 在保存点之后创建另一个保存点
SAVEPOINT savepoint2;
UPDATE users SET gender = 'female' WHERE id = 2;
-- 回滚到第一个保存点,撤销其后的所有操作
ROLLBACK TO SAVEPOINT savepoint1;
COMMIT;

在这个示例中,先使用 BEGIN 命令开启一个新的事务,并在其中创建了两个保存点。在第一个保存点之后执行了一个 UPDATE 操作,在第二个保存点之后又执行了一个 UPDATE 操作。最后使用 ROLLBACK TO 命令回滚到了第一个保存点,撤销了第二个保存点之后的所有操作。

六、示例代码

下面是一些事务相关的示例代码,用于演示如何使用 Mysql 中的事务来保证数据的完整性和一致性。

1.开启一个新的事务并执行插入操作:

BEGIN;
INSERT INTO users (name, age, gender) VALUES ('John', 25, 'male');
INSERT INTO users (name, age, gender) VALUES ('Jane', 29, 'female');
COMMIT;

这个事务将执行两个 INSERT 操作,向 users 表中插入两条新记录。如果这个事务执行成功,那么其中的所有操作都将被永久保存到数据库。

2.开启一个新的事务并执行更新操作:

BEGIN;
UPDATE users SET gender = 'male' WHERE age > 30;
UPDATE users SET gender = 'female' WHERE age < 20;
COMMIT;

这个事务将执行两个 UPDATE 操作,将 users 表中年龄大于 30 的记录的性别修改为 male,将年龄小于 20 的记录的性别修改为 female。如果这个事务执行失败或者出现异常,那么其中的所有操作都将被自动回滚。

3.开启一个新的事务并执行删除操作:

BEGIN;
DELETE FROM users WHERE age < 18;
DELETE FROM orders WHERE user_id IN (SELECT id FROM users WHERE age < 18);
COMMIT;

这个事务将执行两个 DELETE 操作,删除 users 表中年龄小于 18 的记录和与这些记录关联的 orders 表中的所有记录。如果这个事务执行成功,那么其中的所有操作都将被永久保存到数据库。

4.在一个事务中使用嵌套事务和保存点:

BEGIN;
-- 在当前事务中创建一个保存点
SAVEPOINT savepoint1;
UPDATE users SET gender = 'male' WHERE id = 1;
-- 在保存点之后创建另一个保存点
SAVEPOINT savepoint2;
UPDATE users SET gender = 'female' WHERE id = 2;
-- 回滚到第一个保存点,撤销其后的所有操作
ROLLBACK TO SAVEPOINT savepoint1;
COMMIT;

这个事务在当前事务中创建了两个保存点,并在第一个保存点之后执行了一个 UPDATE 操作,在第二个保存点之后又执行了一个 UPDATE 操作。最后使用 ROLLBACK TO 命令回滚到了第一个保存点,撤销了第二个保存点之后的所有操作。

七、总结

Mysql 中的事务是保证数据完整性和一致性的基本方法之一,可通过 BEGIN、COMMIT 和 ROLLBACK 命令来实现事务的开启、提交和回滚。同时也支持事务的隔离级别、事务的嵌套和保存点等高级特性,以满足不同的业务需求。在应用程序中,需要根据具体的业务场景和需要选择适当的事务隔离级别和实现方式,来保证系统的稳定性和性能。

到此这篇关于详解MySQL中的事务与ACID特性的文章就介绍到这了,更多相关MySQL事务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一千行的MySQL学习笔记汇总

    一千行的MySQL学习笔记汇总

    这篇文章主要介绍了一千行的MySQL学习笔记汇总,实例总结了MySQL学习中遇到的各类常见问题与实用技巧,需要的朋友可以参考下
    2014-10-10
  • MySQL 一则慢日志监控误报的问题分析与解决

    MySQL 一则慢日志监控误报的问题分析与解决

    这篇文章主要介绍了MySQL 一则慢日志监控误报的问题分析与解决,帮助大家更好的理解和使用MySQL,感兴趣的朋友可以了解下
    2021-01-01
  • 浅谈MySQL临时表与派生表

    浅谈MySQL临时表与派生表

    MySQL在处理请求的某些场景中,服务器创建内部临时表。即表以MEMORY引擎在内存中处理,或以MyISAM引擎储存在磁盘上处理.如果表过大,服务器可能会把内存中的临时表转存在磁盘上。
    2017-02-02
  • MySQL数据库约束详解

    MySQL数据库约束详解

    mysql常见约束有:1、非空约束“not null”;2、唯一性约束“unique”;3、主键约束“primary key”;4、外键约束“foreign key”;5、默认值约束“Default”等等。
    2022-10-10
  • K8s 如何部署 MySQL 8.0.20 主从复制结构

    K8s 如何部署 MySQL 8.0.20 主从复制结构

    这篇文章主要介绍了K8s 如何部署 MySQL 8.0.20 主从复制结构,本次使用 OpenEBS 来作为存储引擎,OpenEBS 是一个开源的、可扩展的存储平台,它提供了一种简单的方式来创建和管理持久化存储卷,需要的朋友可以参考下
    2024-04-04
  • 在SQL中获取一个长字符串中某个字符串出现次数的实现方法

    在SQL中获取一个长字符串中某个字符串出现次数的实现方法

    以下是对在SQL中获取一个长字符串中某个字符串出现次数的实现方法进行了详细的分析介绍,需要的朋友可以参考下
    2013-07-07
  • mysql死锁和分库分表问题详解

    mysql死锁和分库分表问题详解

    这篇文章主要给大家介绍了关于mysql死锁和分库分表问题的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • IntelliJ IDEA 2024与MySQL 8连接以及driver问题解决办法

    IntelliJ IDEA 2024与MySQL 8连接以及driver问题解决办法

    在IDE开发工具中也是可以使用mysql的,下面这篇文章主要给大家介绍了关于IntelliJ IDEA 2024与MySQL 8连接以及driver问题解决办法,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2024-09-09
  • mysql5.7.18安装时提示无法找到入口问题的解决方法

    mysql5.7.18安装时提示无法找到入口问题的解决方法

    这篇文章主要为大家详细介绍了mysql5.7.18安装时出现无法找到入口问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • Mysql中 unique列插入重复值该怎么解决呢

    Mysql中 unique列插入重复值该怎么解决呢

    本文给大家介绍mysql中unique列插入重复值的解决方案,主要基于mysql平台,通过这些,可以做到一些新的功能和应用。特此把本文本文分享给广大开发人员
    2015-11-11

最新评论