详解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之where使用详解

    MySQL之where使用详解

    我们需要获取数据库表数据的特定子集时,可以使用where子句指定搜索条件进行过滤。本文主要介绍了MySQL之where使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • mysql报错sql_mode=only_full_group_by解决

    mysql报错sql_mode=only_full_group_by解决

    这篇文章主要为大家介绍了mysql报错sql_mode=only_full_group_by解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • 解析mysql与Oracle update的区别

    解析mysql与Oracle update的区别

    本篇文章是对mysql与Oracle update的区别进行了详细的分析介绍,需要的朋友参考下
    2013-07-07
  • MySQL 全文索引使用指南

    MySQL 全文索引使用指南

    在 MySQL 中,我们经常使用 WHERE 条件用于进行值的相等比较、范围过滤。然而,我们也会使用关键字进行搜索,这个基于搜索值与其他值的相关性来进行过滤。MySQL全文检索即用于这种场景。本篇将介绍如何使用全文检索。
    2021-05-05
  • Linux环境mysql5.7.12安装教程

    Linux环境mysql5.7.12安装教程

    这篇文章主要为大家详细介绍了Linux环境Mysql5.7.12安装教程,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • 在Windows环境下使用MySQL:实现自动定时备份

    在Windows环境下使用MySQL:实现自动定时备份

    下面小编就为大家分享一篇在Windows环境下使用MySQL:实现自动定时备份的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • 浅谈MySQL如何优雅的做大表删除

    浅谈MySQL如何优雅的做大表删除

    这篇文章主要介绍了浅谈MySQL如何优雅的做大表删除,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • linux下改良版本mysqldump来备份MYSQL数据库

    linux下改良版本mysqldump来备份MYSQL数据库

    我的备份脚本都是在凌晨执行的,经常在慢查询日志里面看到这样的信息:select * from table1; 之前一直很纳闷,最后才了解到原来是MYSQLDUMP搞的鬼。
    2008-07-07
  • MySQL增删查改数据表详解

    MySQL增删查改数据表详解

    这篇文章主要介绍了MySQL增删查改数据表,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-11-11
  • MySQL8.0实现窗口函数计算同比环比

    MySQL8.0实现窗口函数计算同比环比

    本文主要介绍了MySQL8.0实现窗口函数计算同比环比,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06

最新评论