1. 程式人生 > 實用技巧 >MYSQL四(TCL)

MYSQL四(TCL)

MYSQL基礎(四)

===========

(TCL)[transaction Control Language(事務控制語言)]

事物:
一個或者一組sql語句組成一個執行單元,這個執行單元要麼全部執行,要麼全部不執行。

案例; 轉賬

張三丰 1000
郭襄 1000

update 表 set 張三丰的餘額=500 where name=‘'張三丰';
update 表 set 郭襄的餘額=1500 where name=‘'郭襄';

- 事務和事務隔離級別

  • 一、事務的特性
  • 二、事務的建立
  • 三、事務的隔離級別:
  • 四、事務的回滾
  • 五、演示savepoint 的使用
  • ===========

    # MYSQL基礎(四)
    /*
    <h2 style="color:green">(TCL)[transaction Control Language(事務控制語言)]</h2>
    
    事物:
                      一個或者一組sql語句組成一個執行單元,這個執行單元要麼全部執行,要麼全部不執行。
    
    案例; 轉賬
    
    張三丰 1000
    郭襄     1000
    
    update 表  set  張三丰的餘額=500 where name=‘'張三丰';
    意外
    update 表  set  郭襄的餘額=1500 where name=‘'郭襄';
    
    事務的特性:ACID
    原子性:一個事務不可再分割了,要麼都執行,要麼都不執行
    一致性:一個事務執行會使資料從一個一致狀態切換到另一個一致狀態
    隔離性;一個事務的執行不受其他事物的干擾
    永續性;一個事務一旦提交,則會永久的改變資料庫的資料
    
    
    事務的建立
    隱式事務;事物沒有明顯的開啟和結束的標記
    比如insert、update、delete 語句
    
    
    事務的隔離級別:								髒讀 	不可重複讀		幻讀
    				read uncommitted:   ✅			✅				✅
    				read committed:				x		  ✅ 				✅ 
    				repeatable read 			x 		x					✅
    				serializable:					x 		x 				x
    				
    				oracle預設第二個 read committed
    				msyql中預設第三個隔離級別  repeatable read
    				
    				檢視隔離級別
    				select @@tx_isolation
    				設定隔離級別
    				set session|global transaction isolation level 隔離級別;
    				
    				
    				
    */
    
    show engines;
    
    show VARIABLES LIKE 'autocommit';
    
    
    delete from 表 where id=1;
    
    顯示事務:事務具有明顯的開啟 和結束的標記
    前提;必須先設定自動提交功能為禁用
    set autocommit=0;
    
    步驟1;開啟事務
    set autocommit=0;
    start trunsaction;可選的
    步驟2;編寫事務中的sql語句(select insert update delete)
    語句1;
    語句2;
    ...
    步驟3:結束事務
    commit;提交事務
    rollback;回滾事務
    
    savepoint 節點名、設定儲存點
    
    update 表  set  張三丰的餘額=500 where name=‘'張三丰';
    #意外
    update 表  set  郭襄的餘額=1500 where name=‘'郭襄';
    
    # 演示事務的步驟
    # 一、建立表時設定標識列
    DROP TABLE IF EXISTS account;
    TRUNCATE TABLE account;
    
    CREATE TABLE account(
    					id INT primary key auto_increment,
    					`username` varchar(20),
    					balance DOUBLE
    )
    SELECT * from account;
    
    INSERT INTO account(username,balance)
    VALUES('張無忌',1000),('趙敏',1000);
    
    
    # 1366 - Incorrect string value:'\xE5\xBC\xA0\xE4\xB8\x89' for column 'name' a 錯誤修改
    alter table account default character set utf8mb4;
    alter table account change username username varchar(20) character set utf8mb4;
    
    # 開啟事務
    set autocommit=0;
    # 編寫一組事務的語句
    UPDATE account set balance = 500 where username='張無忌';
    UPDATE account set balance = 1500 where username='趙敏';
    # 結束事務
    ROLLBACK;
    commit;
    
    SELECT * from account;
    
    ALTER database students character set utf8mb4;
    
    
    # 演示savepoint 的使用 
    set autocommit=0;
    start transaction;
    delete FROM account where id=3;
    SAVEPOINT a;#設定儲存點
    delete FROM account where id=4;
    ROLLBACK to a;# 回滾到儲存點
    
    SELECT * FROM account;