1. 程式人生 > SQL入門教學 >29 SQL 事務1

29 SQL 事務1

1. 定義

解釋: 事務(Transaction)是資料庫中的一個核心概念,指的是將資料庫的一組操作作為一個整體,要麼全部執行,要麼都不執行。

2. 前言

本小節,我們將一起學習資料庫中的一個重點內容——事務

事務並非 SQL 中獨有,在資料庫、程式語言、各類框架中均有出現,而且無一例外都是重點。事務是一個較為複雜的概念,本小節會有一定的理論闡述,當然也會有一些小例子來幫助你理解。

事務的內容比較多,本小節會介紹事務的概念和基本使用,下一小節我們再來探討事務的四種隔離級別。

本小節測試資料如下,請先在資料庫中執行,本小節的所有操作若無特殊說明預設在 MySQL 中執行。

DROP TABLE
IF EXISTS imooc_user; CREATE TABLE imooc_user ( id int PRIMARY KEY, username varchar(20), age int ); INSERT INTO imooc_user(id,username,age) VALUES (1,'peter',18),(2,'pedro',24),(3,'jerry',22),(4,'mike',18),(5,'tom',20);

3. 理論

3.1 特性

事務具有四大特性,即ACID,它們分別是:

  • 原子性(Atomicity):每個事務都是一個整體,不可再拆分,事務中的 SQL 操作要麼全部執行成功,要麼全部失敗。
  • 一致性(Consistency):事務執行前後資料庫的狀態必須保持一致。如 A 轉賬給 B,轉賬後金額的總數是不變的。
  • 隔離性(Isolation):事務與事務之間互不影響,彼此隔離。
  • 永續性(Durability):事務一旦提交成功,對資料庫的更改就是永久的,即使出現了其它情況,資料改變仍然存在。

事務的四大特性是事務最本質的特點,在這四個特性中,原子性是基礎,隔離性是手段,一致性是約束條件,而永續性是我們的目的。

3.2 語法

事務是一組操作的集合,因此沒有固定的語法格式,事務常見的控制語句如下:

  1. START TRANSACTIONBEGIN,用來顯式地開始一個事務。
  2. COMMIT
    ,提交事務。
  3. SAVEPOINT,建立儲存點,一個事務可以有多個儲存點,事務可以根據儲存點進行回滾。
  4. ROLLBACKROLLBACK TO [SAVEPOINT],回滾事務,預設回滾所有更改,如果加上儲存點,則回滾到儲存點。
  5. RELEASE SAVEPOINT,釋放儲存點,即刪除某個儲存點,儲存點被刪除後,不可回滾。
  6. SET TRANSACTION,設定事務的隔離級別,在下小節將會詳細介紹。

提示: 並不是每個資料庫引擎都支援事務,如 MySQL 的 MyISAM 引擎就不支援事務。

4. 實踐

事務使用的一般流程為:通過 BEGIN 開始一個事務,進行一組資料操作,如果操作成功,通過 COMMIT 提交事務,否則通過 ROLLBACK 回滾。

4.1 例1 提交事務

請書寫 SQL 語句,通過一個事務向imooc_user表插入一個使用者,使用者名稱為lucy,年齡為21,並提交事務。

分析:

先顯示通過 BEGIN 開始一個事務,然後使用 INSERT 語句插入使用者,再通過 COMMIT 提交事務即可。

語句:

整理可得語句如下:

BEGIN;
INSERT INTO imooc_user(id,username,age) VALUES (6,'lucy',21);
COMMIT;

執行成功後,結果如下:

+----+----------+-----+
| id | username | age |
+----+----------+-----+
| 6  | lucy     | 21  |
+----+----------+-----+

4.2 例2 回滾事務

事務提交和事務回滾是一對互斥操作,事務回滾後,事務之前的操作都將失效

請書寫 SQL 語句,通過一個事務向imooc_user表插入一個使用者,使用者名稱為dell,年齡為21,並回滾事務。

分析:

先顯示通過 BEGIN 開始一個事務,然後使用 INSERT 語句插入使用者,再通過 ROLLBACK 回滾事務即可。

語句:

整理可得語句如下:

BEGIN;
INSERT INTO imooc_user(id,username,age) VALUES (7,'dell',21);
ROLLBACK;

執行成功後,dell 並未被插入到 imooc_user 表中,可見 ROLLBACK 的確撤銷了之前的資料操作。

4.3 例3 回滾且提交事務

前面談到,事務的回滾是可以指定儲存點的,因此我們可以只回滾部分操作,提交其它操作。

如下:

BEGIN;
INSERT INTO imooc_user(id,username,age) VALUES (8,'stark', 20);
SAVEPOINT savepoint1;
INSERT INTO imooc_user(id,username,age) VALUES (9,'alice', 20);
ROLLBACK TO savepoint1;
COMMIT;

上面的 SQL 語句的大致執行流程如下:

  1. BEGIN 顯示的開啟了一個事務。
  2. 向 imooc_user 表中插入了使用者 stark ,並且通過 SAVEPOINT 新建了儲存點 savepoint1。
  3. 又向 imooc_user 中插入了另外一個使用者 alice。
  4. 通過 ROLLBACK 將事務回滾到了 savepoint1,即第2個插入語句將會失效。
  5. 提交事務。

執行成功後,資料如下:

+----+----------+-----+
| id | username | age |
+----+----------+-----+
| 8  | stark    | 20  |
+----+----------+-----+

從結果中可以得出,alice 使用者並沒有插入成功,這與我們的分析一致,也驗證了事務的強大。

5. 小結

  • 事務是資料庫的重點,也是很多框架的重點,是支撐併發的基石,因此請務必多多練習事務的使用。
  • 事務的四大特性雖然內容較多,但歷來都是面試的重點,請務必理解並且熟稔於心。