MySQL 事務主要用于處理操作量大,複雜度高的資料。比如說,在人員管理系統中,你删除一個人員,你即需要删除人員的基本資料,也要删除和該人員相關的資訊,如信箱,文章等等,這樣,這些資料庫操作語句就構成一個事務!
- 在 MySQL 中隻有使用了 Innodb 資料庫引擎的資料庫或表才支援事務。
- 事務處理可以用來維護資料庫的完整性,保證成批的 SQL 語句要麼全部執行,要麼全部不執行。
- 事務用來管理 insert,update,delete 語句 事務四大特性(簡稱ACID)
- 原子性(Atomicity)
- 一緻性(Consistency)
- 隔離性(Isolation)
- 持久性(Durability)
以下内容出自《高性能MySQL》第三版,了解事務的ACID及四種隔離級有助于我們更好的了解事務運作。
下面舉一個銀行應用是解釋事務必要性的一個經典例子。假如一個銀行的資料庫有兩張表:支票表(checking)和儲蓄表(savings)。現在要從使用者Jane的支票賬戶轉移200美元到她的儲蓄賬戶,那麼至少需要三個步驟:
- 檢查支票賬戶的餘額高于或者等于200美元。
- 從支票賬戶餘額中減去200美元。
- 在儲蓄帳戶餘額中增加200美元。
上述三個步驟的操作必須打包在一個事務中,任何一個步驟失敗,則必須復原所有的步驟。
可以用START TRANSACTION語句開始一個事務,然後要麼使用COMMIT送出将修改的資料持久儲存,要麼使用ROLLBACK撤銷所有的修改。事務SQL的樣本如下:
- start transaction;
- select balance from checking where customer_id = 10233276;
- update checking set balance = balance - 200.00 where customer_id = 10233276;
- update savings set balance = balance + 200.00 where customer_id = 10233276;
- commit;
一個很好的事務處理系統,必須具備這些标準特性:
- 原子性(atomicity)
一個事務必須被視為一個不可分割的最小工作單元,整個事務中的所有操作要麼全部送出成功,要麼全部失敗復原,對于一個事務來說,不可能隻執行其中的一部分操作,這就是事務的原子性
- 一緻性(consistency)
資料庫總是從一個一緻性的狀态轉換到另一個一緻性的狀态。(在前面的例子中,一緻性確定了,即使在執行第三、四條語句之間時系統崩潰,支票賬戶中也不會損失200美元,因為事務最終沒有送出,是以事務中所做的修改也不會儲存到資料庫中。)
- 隔離性(isolation)
通常來說,一個事務所做的修改在最終送出以前,對其他事務是不可見的。(在前面的例子中,當執行完第三條語句、第四條語句還未開始時,此時有另外的一個賬戶彙總程式開始運作,則其看到支票帳戶的餘額并沒有被減去200美元。)
- 持久性(durability)
一旦事務送出,則其所做的修改會永久儲存到資料庫。(此時即使系統崩潰,修改的資料也不會丢失。)
事務指令
表的引擎類型必須是innodb類型才可以使用事務,這是mysql表的預設引擎
檢視表的建立語句,可以看到engine=innodb
-- 選擇資料庫
use jing_dong;
-- 檢視goods表
show create table goods;
開啟事務,指令如下:
- 開啟事務後執行修改指令,變更會維護到本地緩存中,而不維護到實體表中
begin;
或者
start transaction;
送出事務,指令如下
- 将緩存中的資料變更維護到實體表中
復原事務,指令如下:
- 放棄緩存中變更的資料
送出
- 為了示範效果,需要打開兩個終端視窗,使用同一個資料庫,操作同一張表(用到之前的jing_dong資料,可以回到mysql第3天中檢視)
step1:連接配接
- 終端1:查詢商品分類資訊
step2:增加資料
- 終端2:開啟事務,插入資料
begin;
insert into goods_cates(name) values('小霸王遊戲機');
- 終端2:查詢資料,此時有新增的資料
step3:查詢
- 終端1:查詢資料,發現并沒有新增的資料
step4:送出
- 終端2:完成送出
step5:查詢
- 終端1:查詢,發現有新增的資料
復原
- 為了示範效果,需要打開兩個終端視窗,使用同一個資料庫,操作同一張表
step1:連接配接
- 終端1
step2:增加資料
- 終端2:開啟事務,插入資料
begin;
insert into goods_cates(name) values('小霸王遊戲機');
- 終端2:查詢資料,此時有新增的資料
step3:查詢
- 終端1:查詢資料,發現并沒有新增的資料
step4:復原
- 終端2:完成復原
step5:查詢
- 終端1:查詢資料,發現沒有新增的資料