1. 程式人生 > 其它 >MySQL筆記6:事務簡介,事務模擬

MySQL筆記6:事務簡介,事務模擬

6. 事務

6.1 什麼是事務

要麼都成功,要麼都失敗

——————————————————————————

  1. SQL執行 A給B轉賬 A 1000 --> 200 --> B 200
  2. SQL執行 B收到A給的錢 A 800 --> B400

——————————————————————————

將一組SQL放在同一個批次中執行。

事務管理原則:ACID

ACID:原子性,一致性,隔離性,永續性

  • 原子性(Atomicity):要麼都完成,要麼都不完成
  • 一致性(Consistency):最終一致性,事務完成後符合邏輯運算,事務前後的資料完整性保證一致
  • 永續性(Durability):事務結束後的資料不隨著外界原因導致資料丟失(如果沒提交就恢復原狀,提交了就持久化到資料庫)事務一旦提交就不可逆
  • 隔離性(Isolation):多個使用者同時操作時不會互相影響

隔離導致的問題

  • 髒讀:一個事務讀取了另外一個事務未提交的資料
  • 不可重複讀:多次讀取資料時讀取結果不同(不一定錯誤,只是場合不對)
  • 幻讀(虛讀):在讀取時讀到了別的事務插入的資料,導致前後讀取不一致

6.2 事務模擬

流程:MySQL預設自動提交

  1. 關閉自動提交
  2. 事務開啟
  3. 執行命令
    • 成功:提交,持久化
    • 失敗:回滾至初始狀態
  4. 開啟自動提交
-- mysql 是預設開啟事務自動提交的
SET autocommit = 0 -- 關閉自動提交
SET autocommit = 1 -- 開啟自動提交(預設)

-- 手動處理事務
SET autocommit = 0
-- 事務開啟
START TRANSACTION -- 標記一個事務的開始,從這個之後sql都在同一個十五內

-- 提交:持久化,成功提交,失敗回滾
COMMIT
-- 回滾:回到原來的樣子
ROLLBACK

-- 事務結束
SET autocommit = 1 -- 開啟自動提交

-- 瞭解
SAVEPOINT 儲存點名 -- 設定一個事務的儲存點
ROLLBACK TO SAVEPOINT 儲存點 -- 回滾到儲存點
RELEASE SAVEPOINT 儲存點 -- 撤銷指定儲存點

模擬轉賬事務

-- 建立資料庫
CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf8_general_ci;

-- 使用shop資料庫
USE `shop`;

-- 建表
CREATE TABLE `account`(
    `id` INT(3) NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(100) 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; -- 恢復自動提交