1. 程式人生 > ><MySQL>入門四 事務控制語言 TCL

<MySQL>入門四 事務控制語言 TCL


--
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;