mysql study
ALTER table 是鎖住整個 table # 1. 檢查支票帳戶餘額是否大於等於200 # 2. 從支票帳戶餘額扣200轉出 # 3. 從存款帳戶餘額加200轉入 簡單的transaction START TRANSACTION; select balance from checking where customer_id = 1 and balace >= 200; update checking set balance = balance - 200 where where customer_id = 1; update savings set balance = balance + 200 where customer_id = 1; COMMIT; 隔離級別 READ_UNCOMMITTED (未提交讀) 一個transaction中修改的東西, 在其他 transaction中是可見的, 也就其他事務可以讀取另一個事務尚未提交 (commit) 的東西, 也被稱作 dirty read, 容易造成很多問題, 效能也不一定會好 READ_COMMITTED 一個transaction在committed之前所做的任何改變都不會被其他transaction看到 REPEATABLE READ 保證了一個transaction讀取同樣的record會是一樣的結果, 理論上無法解決Phantom Read (幻讀)的問題, 幻讀是某個transaction A在讀取某個範圍的資料時, 別的transaction剛好在這個範圍內新增一筆資料, 造成這個transaction A會產生Phantom Row, InnoDB透過多版本併發控制 (Multi Version Concurrency Control) 解決幻讀的問題 SERIALIZABLE 最高的隔離級別, 強迫所有transaction一個接一個執行, 就不會有Phantom Read的問題, 也就是在讀取的每一行都加上read lock(讀鎖), 會導致大量超時與搶鎖的問題,只有在非常強調資料一致性與可以接受非併發環境才可以考慮使用 MySQL預設開啟 autocommit show variables like '...