SQL 事務1
1. 定義
慕課解釋:
事務
(Transaction)是數(shù)據(jù)庫中的一個核心概念,指的是將數(shù)據(jù)庫的一組操作作為一個整體,要么全部執(zhí)行,要么都不執(zhí)行。
2. 前言
本小節(jié),我們將一起學習數(shù)據(jù)庫中的一個重點內(nèi)容——事務
。
事務并非 SQL 中獨有,在數(shù)據(jù)庫、編程語言、各類框架中均有出現(xiàn),而且無一例外都是重點
。事務是一個較為復雜的概念,本小節(jié)會有一定的理論闡述,當然也會有一些小例子來幫助你理解。
事務的內(nèi)容比較多,本小節(jié)會介紹事務的概念和基本使用,下一小節(jié)我們再來探討事務的四種隔離級別。
本小節(jié)測試數(shù)據(jù)如下,請先在數(shù)據(jù)庫中執(zhí)行,本小節(jié)的所有操作若無特殊說明默認在 MySQL 中執(zhí)行。
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 操作要么全部執(zhí)行成功,要么全部失敗。
- 一致性(Consistency):事務執(zhí)行前后數(shù)據(jù)庫的狀態(tài)必須保持一致。如 A 轉(zhuǎn)賬給 B,轉(zhuǎn)賬后金額的總數(shù)是不變的。
- 隔離性(Isolation):事務與事務之間互不影響,彼此隔離。
- 持久性(Durability):事務一旦提交成功,對數(shù)據(jù)庫的更改就是永久的,即使出現(xiàn)了其它情況,數(shù)據(jù)改變?nèi)匀淮嬖凇?/li>
事務的四大特性是事務最本質(zhì)的特點,在這四個特性中,原子性是基礎,隔離性是手段,一致性是約束條件,而持久性是我們的目的。
3.2 語法
事務是一組操作的集合,因此沒有固定的語法格式,事務常見的控制語句如下:
START TRANSACTION
或BEGIN
,用來顯式地開始一個事務。COMMIT
,提交事務。SAVEPOINT
,創(chuàng)建保存點,一個事務可以有多個保存點,事務可以根據(jù)保存點進行回滾。ROLLBACK
或ROLLBACK TO [SAVEPOINT]
,回滾事務,默認回滾所有更改,如果加上保存點,則回滾到保存點。RELEASE SAVEPOINT
,釋放保存點,即刪除某個保存點,保存點被刪除后,不可回滾。SET TRANSACTION
,設置事務的隔離級別,在下小節(jié)將會詳細介紹。
提示: 并不是每個數(shù)據(jù)庫引擎都支持事務,如 MySQL 的 MyISAM 引擎就不支持事務。
4. 實踐
事務使用的一般流程為:通過 BEGIN 開始一個事務,進行一組數(shù)據(jù)操作,如果操作成功,通過 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;
執(zhí)行成功后,結(jié)果如下:
+----+----------+-----+
| 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;
執(zhí)行成功后,dell 并未被插入到 imooc_user 表中,可見 ROLLBACK 的確撤銷了之前的數(shù)據(jù)操作。
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 語句的大致執(zhí)行流程如下:
- BEGIN 顯示的開啟了一個事務。
- 向 imooc_user 表中插入了用戶 stark ,并且通過 SAVEPOINT 新建了保存點 savepoint1。
- 又向 imooc_user 中插入了另外一個用戶 alice。
- 通過 ROLLBACK 將事務回滾到了 savepoint1,即第2個插入語句將會失效。
- 提交事務。
執(zhí)行成功后,數(shù)據(jù)如下:
+----+----------+-----+
| id | username | age |
+----+----------+-----+
| 8 | stark | 20 |
+----+----------+-----+
從結(jié)果中可以得出,alice 用戶并沒有插入成功,這與我們的分析一致,也驗證了事務的強大。
5. 小結(jié)
- 事務是數(shù)據(jù)庫的重點,也是很多框架的重點,是支撐并發(fā)的基石,因此請務必多多
練習
事務的使用。 - 事務的四大特性雖然內(nèi)容較多,但歷來都是面試的重點,請務必理解并且熟稔于心。