SQL - 事务:初学者指南

你好,未来的数据库大师们!今天,我们将踏上一段激动人心的旅程,探索SQL事务的世界。如果你之前从未编写过一行代码,不用担心——我会成为你的友好向导,我们将一起逐步探索这个主题。所以,拿起一杯咖啡(或者如果你喜欢,一杯茶),让我们一起开始吧!

SQL - Transactions

SQL事务是什么?

想象一下你正在ATM机上从你的账户中取钱。这个过程涉及几个步骤:检查你的余额、扣除金额和分发现金。现在,如果机器在中间崩溃了怎么办?你肯定不想丢失你的钱,对吧?这就是事务派上用场的地方!

在SQL中,事务是一系列被视为单一工作单元的操作。它就像是你数据库操作周围的保护罩,确保要么所有操作都成功,要么一个都不成功。这样,你的数据就能保持一致和可靠。

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

BEGIN TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE account_id = 123;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 456;
COMMIT;

在这个事务中,我们正在将100美元从一个账户转移到另一个账户。BEGIN TRANSACTION标志着我们事务的开始,而COMMIT则最终确定它。如果在这两个点之间出了任何问题,整个事务都可以撤销,以保持我们的账户平衡。

事务的性质

事务有四个关键性质,通常通过ACID这个缩写来记忆。让我们分解一下:

原子性

原子性确保事务被视为一个单一、不可分割的单位。要么是全部,要么都不是——事务中的所有操作要么全部成功,要么一个都不成功。

一致性

一致性保证事务将数据库从一个有效状态转移到另一个有效状态。这就像确保无论你进行多少次购买,你的钱包里总是有正确的金额。

隔离性

隔离性使事务相互独立。这就像在共享房屋中拥有自己的私人房间——在你的事务中发生的事情会保留到事务完成。

持久性

持久性确保一旦事务提交,它就会保持提交状态。这就像在树上刻上你的名字——即使有风暴,它们也会在那里。

事务控制命令

现在我们了解了事务是什么以及为什么它们很重要,让我们来看看我们用来控制它们的命令。我将这些命令以表格的形式呈现,以便于参考:

命令 描述
BEGIN TRANSACTION 开始一个新事务
COMMIT 保存事务中做的更改
ROLLBACK 撤销事务中做的更改
SAVEPOINT 在事务中创建一个可以回滚到的点
RELEASE SAVEPOINT 移除事务中的保存点
SET TRANSACTION 为事务指定特性

让我们更详细地探索每一个!

COMMIT命令

COMMIT命令就像在视频游戏中按下“保存”按钮。它最终确定事务中的所有更改。下面是如何使用它的示例:

BEGIN TRANSACTION;
INSERT INTO students (name, age) VALUES ('Alice', 20);
UPDATE courses SET available_seats = available_seats - 1 WHERE course_id = 101;
COMMIT;

在这个例子中,我们正在注册Alice的课程。我们将她添加到学生表中,并减少了课程的可用座位数。最后的COMMIT使这些更改永久生效。

ROLLBACK命令

ROLLBACK是你的“撤销”按钮。如果在事务中出了问题,你可以使用ROLLBACK来取消所有更改,并返回到事务开始之前的状态。

BEGIN TRANSACTION;
DELETE FROM students WHERE name = 'Bob';
-- 哦哦!我们并不想删除Bob!
ROLLBACK;

在这里,我们意外地从学生表中删除了Bob。但是不用担心!ROLLBACK命令通过撤销删除来拯救了这一天。

SAVEPOINT命令

SAVEPOINT就像在事务中创建一个检查点。你可以创建多个保存点,并在需要时回滚到任何一个。

BEGIN TRANSACTION;
INSERT INTO courses (course_name, instructor) VALUES ('SQL 101', 'Prof. Smith');
SAVEPOINT new_course;

UPDATE instructors SET courses_taught = courses_taught + 1 WHERE name = 'Prof. Smith';
-- 哦哦!Prof. Smith这个学期休假
ROLLBACK TO new_course;

UPDATE instructors SET courses_taught = courses_taught + 1 WHERE name = 'Prof. Johnson';
COMMIT;

在这个例子中,我们在添加新课程后创建了一个保存点。当我们意识到我们分配了错误的讲师时,我们可以回滚到保存点并进行正确的更新。

RELEASE SAVEPOINT命令

RELEASE SAVEPOINT命令移除你不再需要的保存点。这就像在游戏中清除一个你确定不再需要回退的检查点。

BEGIN TRANSACTION;
SAVEPOINT update_start;
UPDATE products SET price = price * 1.1;
-- 价格上涨成功,我们不再需要保存点
RELEASE SAVEPOINT update_start;
COMMIT;

在这里,我们在更新产品价格之前创建了一个保存点。一旦我们确定更新是正确的,我们释放保存点,因为我们不再需要它。

SET TRANSACTION命令

SET TRANSACTION命令允许你为事务指定特性,如隔离级别或只读状态。

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
BEGIN TRANSACTION;
SELECT * FROM sensitive_data;
COMMIT;

在这个例子中,我们在开始事务之前将事务隔离级别设置为“READ COMMITTED”。这确保我们只读取其他事务已经提交的数据,帮助防止脏读。

至此,亲爱的朋友们!我们已经穿越了SQL事务的土地,从理解它们是什么到掌握控制它们的命令。记住,熟能生巧,所以不要害怕在安全、测试环境中尝试这些概念。

事务一开始可能看起来有点抽象,但它们就像是数据库世界的安全网。它们使我们的数据保持一致,使我们的应用程序保持可靠。所以下次你在一个数据库项目上工作时,记得将重要操作用事务包裹起来——你的未来自我(和你的用户)会感谢你的!

快乐编码,愿你的事务永远成功提交!

Credits: Image by storyset