MySQL - 事务:初学者指南
你好,未来的数据库大师们!今天,我们将踏上一段激动人心的旅程,探索MySQL事务的世界。别担心,如果你是编程新手——我会成为你的友好向导,将复杂的概念分解成易于消化的碎片。那么,拿起你最喜欢的饮料,让我们一起深入了解一下吧!
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代表:
- 原子性:事务中的所有操作要么全部成功,要么全部失败。
- 一致性:数据库在事务之前和之后保持一致状态。
- 隔离性:事务在完成之前相互隔离。
- 持久性:一旦事务被提交,即使系统发生故障,它也会保持不变。
将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中的所有表类型都支持事务。主要的事务安全存储引擎有:
- InnoDB
- 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