SQL事務詳解
#TCL
/*
Transaction Control Language 事務控制語言
事務:
一個或一組sql語句組成一個執行單元,這個執行單元要麼全部執行,要麼全部不執行。
案例:轉賬
張三丰 1000
郭襄 1000
update 表 set 張三丰的餘額=500 where name=‘張三丰’
意外
update 表 set 郭襄的餘額=1500 where name=‘郭襄’
事務的特性: ACID 原子性:一個事務不可再分割,要麼都執行要麼都不執行 一致性:一個事務執行會使資料從一個一致狀態切換到另外一個一致狀態 隔離性:一個事務的執行不受其他事務的干擾 永續性:一個事務一旦提交,則會永久的改變資料庫的資料.
事務的建立
隱式事務:事務沒有明顯的開啟和結束的標記
比如insert、update、delete語句
delete from 表 where id =1;
顯式事務:事務具有明顯的開啟和結束的標記
前提:必須先設定自動提交功能為禁用
set autocommit=0;
步驟1:開啟事務
set autocommit=0;
start transaction;可選的
步驟2:編寫事務中的sql語句(select insert update delete)
語句1;
語句2;
…
步驟3:結束事務
commit;提交事務
rollback;回滾事務
savepoint 節點名;設定儲存點
髒讀: 一個事務讀取了其他事務還沒有提交的資料,讀到的是其他事務“更新”的資料
不可重複讀: 一個事務多次讀取,結果不一樣
幻讀: 一個事務讀取了其他事務還沒有提交的資料,只是讀到的是 其他事務“插入”的資料
== 對於同時執行的多個事務, 當這些事務訪問資料庫中相同的資料時, 如果沒
有采取必要的隔離機制, 就會導致各種併發問題==:
1、髒讀: 對於兩個事務 T1, T2, T1 讀取了已經被 T2 更新但還 沒有被提交的欄位.
之後, 若 T2 回滾, T1讀取的內容就是臨時且無效的.
2、不可重複讀: 對於兩個事務T1, T2, T1 讀取了一個欄位, 然後 T2 更新了該欄位.
之後, T1再次讀取同一個欄位, 值就不同了.
3、幻讀: 對於兩個事務T1, T2, T1 從一個表中讀取了一個欄位, 然後 T2 在該表中 插
入了一些新的行. 之後, 如果 T1 再次讀取同一個表, 就會多出幾行.
資料庫事務的隔離性: 資料庫系統必須具有隔離併發執行各個事務的能力,
使它們不會相互影響, 避免各種併發問題.
一個事務與其他事務隔離的程度稱為隔離級別. 資料庫規定了多種事務隔
離級別, 不同隔離級別對應不同的干擾程度, 隔離級別越高, 資料一致性就
越好, 但併發性越弱.
事務的隔離級別:
髒讀 不可重複讀 幻讀
讀未提交 read uncommitted: √ √ √
讀已提交 read committed: × √ √ 可以避免髒讀
可重複讀 repeatable read: × × √ 可以避免髒讀、不可重複讀和一部分幻讀
序列化 serializable × × × 可以避免髒讀、不可重複讀和幻讀
mysql中預設 第三個隔離級別 repeatable read
oracle中預設第二個隔離級別 read committed
Oracle 支援的 2 種事務隔離級別:READ COMMITED,SERIALIZABLE.
Mysql 支援 4 種事務隔離級別.
檢視隔離級別
select @@tx_isolation;
設定隔離級別 session:當前 global :全域性
set session|global transaction isolation level 隔離級別;
開啟事務的語句;
update 表 set 張三丰的餘額=500 where name=‘張三丰’
update 表 set 郭襄的餘額=1500 where name=‘郭襄’
結束事務的語句;
*/
```javascript
```javascript
SHOW VARIABLES LIKE 'autocommit';
SHOW ENGINES; #來檢視mysql支援的儲存引擎。
#其中innodb支援事務,而myisam、memory等不支援事務
#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的處理的區別
SET autocommit=0;
START TRANSACTION;
DELETE FROM account;
ROLLBACK;
#3.演示savepoint 的使用
SET autocommit=0;
START TRANSACTION;
DELETE FROM account WHERE id=25;
SAVEPOINT a;#設定儲存點
DELETE FROM account WHERE id=28;
ROLLBACK TO a;#回滾到儲存點
SELECT * FROM account;