MySQL - Transactions: A Beginner's Guide

您好,未來的數據庫大師!今天,我們將踏上一段令人興奮的旅程,進入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中的所有表類型都支持事務。主要的事務安全存儲引擎有:

  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