十八、MySQL之TCL事務控制語言(詳解)

TCL :

Transaction Control Language 事務控制語言

零、MySQL 中的存儲引擎

1、概念:在mysql中的數據用各種不同的技術存儲在文件(或內存)中。
2、通過show engines;來查看mysql支持的存儲引擎。
3、 在mysql中用的最多的存儲引擎有:innodb,myisam ,memory 等。其中innodb支持事務,而myisam、memory等不支持事務
在這裏插入圖片描述

一、事務:

事務由單獨單元的一個或多個SQL語句組成,在這個單元中,每個MySQL語句是相互依賴的。而整個單獨單元作爲一個不可分割的整體,如果單元中某條SQL語句一旦執行失敗或產生錯誤,整個單元將會回滾所有受到影響的數據將返回到事物開始以前的狀態;如果單元中的所有SQL語句均執行成功,則事物被順利執行。
一個或一組sql語句組成一個執行單元,這個執行單元要麼全部執行,要麼全部不執行。

案例:轉賬

張三丰 1000 郭襄 1000

update 表 set 張三丰的餘額=500 where name=‘張三丰’
意外
update 表 set 郭襄的餘額=1500 where name=‘郭襄’

事務的特性:ACID
1. 原子性:一個事務不可再分割,要麼都執行要麼都不執行
2. 一致性:一個事務執行會使數據從一個一致狀態切換到另外一個一致狀態
3. 隔離性:一個事務的執行不受其他事務的干擾
4. 持久性:一個事務一旦提交,則會永久的改變數據庫的數據.

二、事務的創建

  1. 隱式事務:事務沒有明顯的開啓和結束的標記
    比如insert、update、delete語句
    delete from 表 where id =1;
    在這裏插入圖片描述

  2. 顯式事務:事務具有明顯的開啓和結束的標記
    前提:必須先設置自動提交功能爲禁用
    set autocommit=0;
    在這裏插入圖片描述

步驟1:開啓事務
set autocommit=0;必須寫
start transaction;可省略不寫
步驟2:編寫事務中的sql語句(select insert update delete)
語句1;
語句2;
...

步驟3:結束事務
commit;提交事務
或者
rollback;回滾事務

savepoint 節點名;設置保存點

三、事務的隔離級別:

髒讀 不可重複讀 幻讀
read uncommitted
read committed X
repeatable read X X
serializable X X X

對於同時運行的多個事務, 當這些事務訪問數據庫中相同的數據時, 如果沒
有采取必要的隔離機制, 就會導致各種併發問題:

  1. 髒讀: 對於兩個事務 T1, T2, T1 讀取了已經被 T2 更新但還沒有被提交的字段. 之後, 若 T2 回滾, T1讀取的內容就是臨時且無效的.
  2. 不可重複讀: 對於兩個事務T1, T2, T1 讀取了一個字段, 然後 T2 更新了該字段. 之後, T1再次讀取同一個字段, 值就不同了.
  3. 幻讀: 對於兩個事務T1, T2, T1 從一個表中讀取了一個字段, 然後 T2 在該表中插入了一些新的行. 之後, 如果 T1 再次讀取同一個表, 就會多出幾行.

數據庫事務的隔離性: 數據庫系統必須具有隔離併發運行各個事務的能力, 使它們不會相互影響, 避免各種併發問題.
一個事務與其他事務隔離的程度稱爲隔離級別. 數據庫規定了多種事務隔
離級別, 不同隔離級別對應不同的干擾程度, 隔離級別越高, 數據一致性就
越好, 但併發性越弱.

數據庫提供的 4 種事務隔離級別:
在這裏插入圖片描述
Oracle 支持的 2 種事務隔離級別:READ COMMITED, SERIALIZABLE。 Oracle 默認的事務是第二個隔離級別爲: READ COMMITED
Mysql 支持 4 種事務隔離級別. Mysql 默認的事務是第三個隔離級別爲: REPEATABLE READ

  1. 查看隔離級別
    select @@tx_isolation;
  2. 設置隔離級別
    set session|global transaction isolation level 隔離級別;
  3. 開啓事務的語句;
    update 表 set 張三丰的餘額=500 where name=‘張三丰’
    update 表 set 郭襄的餘額=1500 where name=‘郭襄’
    結束事務的語句;

每啓動一個 mysql 程序, 就會獲得一個單獨的數據庫連接. 每個數據庫連接都有一個全局變量 @@tx_isolation, 表示當前的事務隔離級別.

  • 查看當前的隔離級別: SELECT @@tx_isolation;
  • 設置當前 mySQL 連接的隔離級別:
    set transaction isolation level read committed;
  • 設置數據庫系統的全局的隔離級別:
    set global transaction isolation level read committed;

在這裏插入圖片描述
在這裏插入圖片描述

四、代碼演示

SHOW VARIABLES LIKE 'autocommit';
SHOW ENGINES;

1.演示事務的使用步驟

#開啓事務
SET autocommit=0;
START TRANSACTION;
#編寫一組事務的語句
UPDATE account SET balance = 1000 WHERE username='張無忌';
UPDATE account SET balance = 1000 WHERE username='趙敏';

#結束事務
ROLLBACK;
#commit;

SELECT * FROM account;

在這裏插入圖片描述
在這裏插入圖片描述
2. 演示事務對於delete和truncate的處理的區別:
在事務中,delete 刪除表是支持rollback回滾的;
但是,truncate 刪除表是不支持rollback回滾

# 2. delete 和 truncate 在事務使用時的區別
# 演示delete
set autocommit=0;
start transaction;
delete from account;
ROLLBACK;


# 演示truncate
set autocommit=0;
start transaction;
truncate TABLE account;
ROLLBACK;
SELECT * from account;

在這裏插入圖片描述
在這裏插入圖片描述

  1. 演示savepoint 的使用
SET autocommit=0;
START TRANSACTION;
DELETE FROM account WHERE id=1;
SAVEPOINT a;#設置保存點
DELETE FROM account WHERE id=2;
ROLLBACK TO a;#回滾到保存點


SELECT * FROM account;

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章