MySQL 事務
1 什麼是事務
要麼都成功,要麼都失敗!
舉例說明:
初始狀態:A爲1000¥ B爲200¥
——————
- SQL執行 A給B轉賬 A 1000 --> 200 B 200
- SQL執行 B收到A的錢 A 800 --> B 400
——————
將以上一組SQL放在一個批次中執行則成爲一個事務!
事務原則: ACID原則:原子性、一致性、隔離性、持久性
原子性(Atomicity): 要麼都成功、要麼都失敗
一致性(Consistency): 針對一個事務操作前語操作後狀態一直。比如總價值一定是1200,不可能增加或減少。
持久性(Durability): 事務結束後的數據不會隨着外界原因導致數據丟失。例如:服務器宕機或者斷電。數據值僅與事務提交狀態相關聯!事務一旦提交不可逆。
隔離性(Isolation): 針對對個用戶同時操作,主要是排除其他事務對本次事務的影響。
隔離所導致的一些問題:
髒讀: 指一個事務讀取了另外一個事務未提交的數據。
不可重複讀: 在一個事務內讀取表中的某一行數據,多次讀取結果不同。(這個不一定錯誤,只是某些場合不對)
虛度(幻讀): 是指在一個事務內讀取到了別的事務插入的數據,導致前後讀取不一致。
2 事務的MySQL實現
-- ========== 事務 ========== --
-- mysql默認開啓事務自動提交
SET autocommit = 0 /*關閉*/
SET autocommit = 1 /*開啓(默認)*/
-- 手動處理事務
SET autocommit = 0 -- 關閉自動提交
-- 事務開啓
START TRANSACTION -- 標記一個事務的開始,從該句之後的sql都在同一個事務內
COMMIT -- 提交:持久化 (成功!)
ROLLBACK -- 回滾:回到原來的樣子 (失敗!)
-- 事務結束
SET autocommit = 1 -- 開啓自動提交
-- 瞭解
SAVEPOINT 保存點名 -- 設置一個事務的保存點
ROLLBACK TO SAVEPOINT -- 回滾到保存點
RELEASE SAVEPOINT 保存點名 -- 撤銷保存點
流程圖展示:
3 轉賬案例
首先需要創建一個商店的數據庫:
-- 商店數據庫
CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf8_general_ci;
USE shop;
創建數據表並插入A、B兩個賬戶:
CREATE TABLE `account`(
`id` INT(3) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(30) NOT NULL,
`money` DECIMAL(9,2) NOT NULL,
PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
INSERT INTO account (`name`,`money`)
VALUES ('A', 2000.00),('B',10000.00)
事務測試:
測試時請逐句執行!
-- 模擬轉賬:事務
SET autocommit = 0; -- 關閉自動提交
START TRANSACTION -- 開啓一組事務
UPDATE account SET money = money-500 WHERE `name`='A' -- A減500
UPDATE account SET money = money+500 WHERE `name`='B' -- B加500
-- 以下兩行選擇一行執行!注意:一旦選擇提交,數據就會持久化!
COMMIT; -- 提交事務
ROLLBACK; -- 回滾
SET autocommit = 1; -- 恢復默認值
寫在最後
Forgetting what is behind and straining toward what is ahead.(Philippians 3:13)
To Demut and Dottie!