MySQL筆記6:事務簡介,事務模擬
阿新 • • 發佈:2022-05-18
6. 事務
6.1 什麼是事務
要麼都成功,要麼都失敗
——————————————————————————
- SQL執行 A給B轉賬 A 1000 --> 200 --> B 200
- SQL執行 B收到A給的錢 A 800 --> B400
——————————————————————————
將一組SQL放在同一個批次中執行。
事務管理原則:ACID
ACID:原子性,一致性,隔離性,永續性
- 原子性(Atomicity):要麼都完成,要麼都不完成
- 一致性(Consistency):最終一致性,事務完成後符合邏輯運算,事務前後的資料完整性保證一致
-
永續性(Durability):事務結束後的資料不隨著外界原因導致資料丟失(如果沒提交就恢復原狀,提交了就持久化到資料庫)事務一旦提交就不可逆
- 隔離性(Isolation):多個使用者同時操作時不會互相影響
隔離導致的問題
- 髒讀:一個事務讀取了另外一個事務未提交的資料
- 不可重複讀:多次讀取資料時讀取結果不同(不一定錯誤,只是場合不對)
- 幻讀(虛讀):在讀取時讀到了別的事務插入的資料,導致前後讀取不一致
6.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 儲存點 -- 撤銷指定儲存點
模擬轉賬事務
-- 建立資料庫 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; -- 恢復自動提交