天天看點

MySQL 事務詳解送出

MySQL 事務主要用于處理操作量大,複雜度高的資料。比如說,在人員管理系統中,你删除一個人員,你即需要删除人員的基本資料,也要删除和該人員相關的資訊,如信箱,文章等等,這樣,這些資料庫操作語句就構成一個事務!

  • 在 MySQL 中隻有使用了 Innodb 資料庫引擎的資料庫或表才支援事務。
  • 事務處理可以用來維護資料庫的完整性,保證成批的 SQL 語句要麼全部執行,要麼全部不執行。
  • 事務用來管理 insert,update,delete 語句                                                                                                事務四大特性(簡稱ACID)
  • 原子性(Atomicity)
  • 一緻性(Consistency)
  • 隔離性(Isolation)
  • 持久性(Durability)

以下内容出自《高性能MySQL》第三版,了解事務的ACID及四種隔離級有助于我們更好的了解事務運作。

下面舉一個銀行應用是解釋事務必要性的一個經典例子。假如一個銀行的資料庫有兩張表:支票表(checking)和儲蓄表(savings)。現在要從使用者Jane的支票賬戶轉移200美元到她的儲蓄賬戶,那麼至少需要三個步驟:

  1. 檢查支票賬戶的餘額高于或者等于200美元。
  2. 從支票賬戶餘額中減去200美元。
  3. 在儲蓄帳戶餘額中增加200美元。

上述三個步驟的操作必須打包在一個事務中,任何一個步驟失敗,則必須復原所有的步驟。

可以用START TRANSACTION語句開始一個事務,然後要麼使用COMMIT送出将修改的資料持久儲存,要麼使用ROLLBACK撤銷所有的修改。事務SQL的樣本如下:

  1. start transaction;
  2. select balance from checking where customer_id = 10233276;
  3. update checking set balance = balance - 200.00 where customer_id = 10233276;
  4. update savings set balance = balance + 200.00 where customer_id = 10233276;
  5. 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:查詢資料,發現沒有新增的資料