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; #返回到保存點