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