MySQL Day06 事務

MySQL 事務

1 什麼是事務

要麼都成功,要麼都失敗!

舉例說明:
初始狀態:A爲1000¥ B爲200¥

——————

  1. SQL執行 A給B轉賬 A 1000 --> 200 B 200
  2. 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!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章