菜鳥學SQL之——TCL(事務控制)語言的學習(MySQL)

TCL語言的學習

TCL事務控制語言

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

引入:

張三丰有1000元,郭襄也有1000元,三豐要給郭襄轉500元,這要執行兩條語句,三豐錢-500,郭襄錢+500

update 表 set 三豐的餘額=500 where name=‘張三丰’

這兩條語句中間出現了意外,這時三豐的錢少了500,而郭襄的錢沒有多。這500不翼而飛了,這時三豐用事務來解決

update 表 set 郭襄的餘額=1500 where name = ‘郭襄’

事務的特性ACID

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

事務的創建

隱式事務:事務沒有明顯的開啓和結束的標記

比如一條insert、update、delete語句

顯示事務:事務具有明顯的開啓或結束的標記

前提:必須先設置自動提交功能爲禁用

set autocommit= 0;

步驟1:開啓事務

set autocommit = 0;#寫了這條語句就默認開啓了事務
start transaction; #這條語句可選

步驟2:編寫事務中的sql語句(select、insert、update、delete)

語句1;
語句2;
...

步驟3:結束事務

commit; #提交事務
或
rollback; #回滾事務
或
savepoint 節點名; #設置保存點

事務導致併發問題

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

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

事務的隔離級別

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

savepoint的使用

SET autocommit = 0;
START TRANSACTION;
DELETE FROM account WHERE id = 25;
SAVEPOINT a; #設置保存點
DELETE FROM account WHERE id = 29;
ROLLBACK TO a; #返回到保存點

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