<MySQL>入門四 事務控制語言 TCL
阿新 • • 發佈:2018-12-12
-- TCL /* Transcation Control Language 事務控制語言 事務:一個或一組sql語句組成一個執行單元,這個執行單元要麼全部執行,要麼全部不執行 案例:轉賬 name 餘額 麥克雷 1000 天使 1000 update 表 set 餘額=500 where name = '麥克雷'; 意外 update 表 set 餘額=1500 where name = '天使'; 出現錯誤或執行失敗,則回滾。3 SHOW ENGINES 可以看到只有InnoDB支援事物 事物的ACID屬性 1.Atomicity 原子性:一個事務是不可再分割的工作單位,事務中的操作要麼都發生,要麼都不發生。 2.Consistency 一致性:事務必須使資料庫從一個一致狀態變成另一個一致性狀態。例如轉賬完成後,餘額的和還是2000。 3.Isolation 隔離性:一個事務的執行不受其他事務干擾,併發時各個事務之間不能互相干擾。 4.Druability 永續性:一個事務一旦被提交,它對資料庫中的資料的改變是永久的。*/ -- 隱式事務:事務沒有明顯的開始和結束標記 如insert,update,delete語句 SHOW VARIABLES LIKE 'autocommit'; -- 預設是自動開啟的 -- 顯式事務:事務具有明顯的開啟和結束的標記 /* 前提:必須先設定自動提交功能為禁用 set autocommit = 0; 開啟事務 可選 start transaction 編寫sql語句(select insert update delete) 語句1, 語句2, ... 結束事務 commit 提交事務 rollback 回滾事務 */CREATE TABLE IF NOT EXISTS account( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(20), balance DOUBLE ); INSERT INTO account(username,balance) VALUES ('麥克雷',1000),('天使',1000); -- 轉賬 SET autocommit = 0; START TRANSACTION; UPDATE account SET balance = 500 WHERE username = '麥克雷';UPDATE account SET balance = 1500 WHERE username = '天使'; COMMIT; SELECT * FROM account;
事務的隔離級別
/* 當同事執行多個事務,當這些事務訪問資料庫中相同的資料時,如果沒有采取必要的隔離機制,就會導致併發問題 對於2個事務 T1 T2 髒讀:T1讀取了T2更新但還沒提交的欄位,若T2回滾,T1讀取的內容就是臨時無效的; 不可重複讀:T1讀取一個欄位,然後T2更新了該欄位後,T1再讀同一欄位,值發生了改變; 幻讀:T1從表中讀取了一些欄位,T2插入了一些新行之後,如果T1再次讀取,就會多出幾行。 設定隔離級別: read uncommited read commited repeatable read serializable mysql支援:四種, 預設隔離級別:repeatable read oracle支援:read commited,serializable,read only 預設隔離級別:read commited */
小結:不可重複讀的和幻讀很容易混淆,不可重複讀側重於修改,幻讀側重於新增或刪除。解決不可重複讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表
-- 顯示隔離級別 SELECT @@tx_isolation -- 設定隔離級別 SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED -- 設定儲存點 savepoing 只能搭配rollback SET autocommit = 0; START TRANSACTION; DELETE FROM account WHERE id = 1; SAVEPOINT a; DELETE FROM account WHERE id = 2; ROLLBACK TO a;