MySQL - 事务:初学者指南

你好,未来的数据库大师们!今天,我们将踏上一段激动人心的旅程,探索MySQL事务的世界。别担心,如果你是编程新手——我会成为你的友好向导,将复杂的概念分解成易于消化的碎片。那么,拿起你最喜欢的饮料,让我们一起深入了解一下吧!

MySQL - Transactions

MySQL事务

想象一下你正在银行里,从你的储蓄账户向你的支票账户转账。你肯定不希望钱从你的储蓄账户中消失而不出现在支票账户中,对吧?这就是事务的用武之地!

在MySQL中,事务是一系列被视为单一工作单元的操作。它就像一组数据库操作周围的防护罩,确保它们要么全部成功,要么全部一起失败。

让我们来看一个简单的例子:

START TRANSACTION;
UPDATE savings_account SET balance = balance - 100 WHERE account_id = 123;
UPDATE checking_account SET balance = balance + 100 WHERE account_id = 456;
COMMIT;

在这个事务中,我们将100美元从储蓄账户转移到支票账户。START TRANSACTION命令开始我们的事务,而最后的COMMIT命令使更改永久生效。

事务的属性

MySQL中的事务遵循ACID属性。不,不是你在实验室里找到的那种酸!ACID代表:

  1. 原子性:事务中的所有操作要么全部成功,要么全部失败。
  2. 一致性:数据库在事务之前和之后保持一致状态。
  3. 隔离性:事务在完成之前相互隔离。
  4. 持久性:一旦事务被提交,即使系统发生故障,它也会保持不变。

将ACID视为你数据库操作的守护天使,确保一切保持整洁有序!

MySQL中的事务性语句

MySQL提供了几个管理事务的语句。让我们在方便的表格中看看它们:

语句 描述
START TRANSACTION 开始一个新事务
COMMIT 将更改永久保存到数据库
ROLLBACK 撤销当前事务中的更改
SET autocommit 启用或禁用自动提交模式
SAVEPOINT 在事务中创建一个可以稍后回滚到的点

现在,让我们更详细地探索每一个。

COMMIT命令

COMMIT命令就像你事务的“保存”按钮。一旦你提交,你所做的所有更改都会变得永久。

START TRANSACTION;
INSERT INTO students (name, age) VALUES ('Alice', 20);
INSERT INTO students (name, age) VALUES ('Bob', 22);
COMMIT;

在这个COMMIT之后,Alice和Bob正式成为我们学生表的一部分。欢迎Alice和Bob加入!

AUTOCOMMIT命令

默认情况下,MySQL运行在自动提交模式,这意味着每个语句都被视为一个单独的事务。你可以像这样关闭它:

SET autocommit = 0;

现在,你需要手动提交你的更改。这就像在视频游戏中关闭自动保存——确保你记得定期保存(提交)!

ROLLBACK命令

ROLLBACK是你的“撤销”按钮。如果你的事务中出了问题,你可以使用ROLLBACK来撤销所有更改。

START TRANSACTION;
DELETE FROM students WHERE name = 'Alice';
-- 哎呀!我们不是要删除Alice!
ROLLBACK;

呼!Alice在我们的数据库中安全无恙。记住,ROLLBACK只适用于尚未提交的更改。

SAVEPOINT命令

SAVEPOINT允许你在你的事务中创建一个检查点。如果需要,你可以回滚到这个点。

START TRANSACTION;
INSERT INTO students (name, age) VALUES ('Charlie', 21);
SAVEPOINT charlie_added;
INSERT INTO students (name, age) VALUES ('David', 23);
-- 哎呀!我们只想添加Charlie
ROLLBACK TO SAVEPOINT charlie_added;
COMMIT;

在这种情况下,Charlie加入了班级,但David没有通过选拔。抱歉,David!

支持事务的MySQL表类型

并非MySQL中的所有表类型都支持事务。主要的事务安全存储引擎有:

  1. InnoDB
  2. NDB Cluster

InnoDB是最常用的,也是近期MySQL版本中的默认引擎。它就像MySQL存储引擎中的瑞士军刀——多功能且可靠!

使用客户端程序进行事务

当使用像命令行客户端这样的MySQL客户端程序时,你可以使用我们讨论过的同样的事务命令。下面是一个小故事来说明:

mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO pet_shop (pet_name, species) VALUES ('Fluffy', 'cat');
Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO pet_shop (pet_name, species) VALUES ('Rover', 'dog');
Query OK, 1 row affected (0.01 sec)

mysql> COMMIT;
Query OK, 0 rows affected (0.02 sec)

就这样,Fluffy猫和Rover狗找到了他们在宠物商店数据库中的新家!

记住,事务是维护数据完整性的好朋友。它们确保你的数据库操作即使在计划外的情况下也是可靠的。在你的MySQL操作中练习使用事务,你很快就会成为数据库大师!

今天关于MySQL事务的课程就到这里。我希望你喜欢这次旅行,就像我一样。继续练习,保持好奇心,快乐编码!

Credits: Image by storyset