MySQL:資料庫事務
1 什麼是事務
事務是一個整體,由一條或者多條SQL 語句組成,這些SQL語句要麼都執行成功,要麼都執行失敗,
只要有一 條SQL出現異常,整個操作就會回滾,整個業務執行失敗
比如: 銀行的轉賬業務,張三給李四轉賬500元 , 至少要操作兩次資料庫, 張三 -500, 李四 + 500,這中 間任何一步出現問題,整個操作就必須全部回滾, 這樣才能保證使用者和銀行都沒有損失.
- 回滾
即在事務執行的過程中發生了某種故障,事務不能繼續執行,系統將事務中對資料庫的所有已完成的操 作全部撤銷,滾回到事務開始時的狀態。(在提交之前執行)
2 模擬轉賬操作
1) 建立 賬戶表
-- 建立賬戶表 CREATETABLE account( -- 主鍵 id INT PRIMARY KEY AUTO_INCREMENT, -- 姓名 NAME VARCHAR(10), -- 餘額 money DOUBLE ); -- 新增兩個使用者 INSERT INTO account (NAME, money) VALUES ('tom', 1000), ('jack', 1000);
2) 模擬tom 給 jack 轉 500 元錢,一個轉賬的業務操作最少要執行下面的 2 條語句:
-- tom賬戶 -500元 UPDATE account SET money = money - 500 WHERE NAME = 'tom'; --jack賬戶 + 500元 UPDATE account SET money = money + 500 WHERE NAME = 'jack';
注:
假設當tom 賬號上 -500 元,伺服器崩潰了。jack 的賬號並沒有+500 元,資料就出現問題了。 我們要保證整個事務執行的完整性,要麼都成功, 要麼都失敗. 這個時候我們就要學習如何操作事務
3 MySql事務操作
MYSQL 中可以有兩種方式進行事務的操作:
- 手動提交事務
- 自動提交事務
手動提交事務
語法格式
功能 | 語句 |
開啟事務 | start transaction; 或者 BEGIN; |
提交事務 | commit; |
回滾事務 | rollback; |
- START TRANSACTION
- 這個語句顯式地標記一個事務的起始點
- COMMIT
- 表示提交事務,即提交事務的所有操作
- 具體地說,就是將事務中所有對資料庫的更新都寫 到磁碟上的物理資料庫中,事務正常結束。
- ROLLBACK
- 表示撤銷事務,即在事務執行的過程中發生了某種故障,事務不能繼續執行
- 系統將事務中 對資料庫的所有已完成的操作全部撤銷,回滾到事務開始時的狀態
手動提交事務流程
執行成功的情況: 開啟事務 -> 執行多條 SQL 語句 -> 成功提交事務
執行失敗的情況: 開啟事務 -> 執行多條 SQL 語句 -> 事務的回滾
成功案例 演示
- 模擬張三給李四轉 500 元錢
1) 命令列登入資料庫
2)使用db2資料庫
USE db2;
3) 執行以下SQL
- 3.1 開啟事務
start transaction;
- 3.2 tom賬戶 -500
update account set money = money - 500 where name = 'tom'
- 3.3 jack賬戶 +500
update account set money = money + 500 where name = 'jack';
4) 此時我們使用 sqlYog查看錶,發現數據並沒有改變
5) 在控制檯執行 commit 提交事務
commit;
6) 再次使用sqlYog檢視, 發現數據在事務提交之後,發生改變
事務回滾演示
如果事務中,有某條sql語句執行時報錯了,我們沒有手動的commit,那整個事務會自動回滾
1) 命令列 開啟事務
start transaction;
2) 插入兩條資料
INSERT INTO account VALUES(NULL,'張百萬',3000); INSERT INTO account VALUES(NULL,'有財',3500);
3) 不去提交事務 直接關閉視窗,發生回滾操作,資料沒有改變
注:
如果事務中 SQL 語句沒有問題,commit 提交事務,會對資料庫資料的資料進行改變。
如果事務 中 SQL 語句有問題,rollback 回滾事務,會回退到開啟事務時的狀態。
自動提交事務
MySQL 預設每一條 DML(增刪改)語句都是一個單獨的事務,每條語句都會自動開啟一個事務,語句執 行完畢 自動提交事務,MySQL 預設開始自動提交事務
MySQL預設是自動提交事務
自動提交事務演示
1) 將tom賬戶金額 +500元
2) 使用 SQLYog 檢視資料庫:發現數據已經改變
取消自動提交
MySQL預設是自動提交事務,設定為手動提交.
1) 登入mysql,檢視autocommit狀態。
SHOW VARIABLES LIKE 'autocommit';
on :自動提交
off : 手動提交
2) 把 autocommit 改成 off;
SET @@autocommit=off;
3) 再次修改,需要提交之後才生效
將jack 賬戶金額 -500元
-- 選擇資料庫 use db2; -- 修改資料 update account set money = money - 500 where name = 'jack'; -- 手動提交 commit;
事務的四大特性 ACID
特 性 | 含義 |
原 子 性 | 每個事務都是一個整體,不可再拆分,事務中所有的 SQL 語句要麼都執行成功, 要麼都 失敗。 |
一 致 性 |
事務在執行前資料庫的狀態與執行後資料庫的狀態保持一致。 如:轉賬前2個人的 總金額 是 2000,轉賬後 2 個人總金額也是 2000 |
隔 離 性 | 事務與事務之間不應該相互影響,執行時保持隔離的狀態. |
持 久 性 | 一旦事務執行成功,對資料庫的修改是持久的。就算關機,資料也是要儲存下來的. |