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. 持久性:一個事務一旦提交,則會永久的改變數據庫的數據.
二、事務的創建
-
隱式事務:事務沒有明顯的開啓和結束的標記
比如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 節點名;設置保存點
三、事務的隔離級別:
髒讀 | 不可重複讀 | 幻讀 | |
---|---|---|---|
read uncommitted | √ | √ | √ |
read committed | X | √ | √ |
repeatable read | X | X | √ |
serializable | X | X | X |
對於同時運行的多個事務, 當這些事務訪問數據庫中相同的數據時, 如果沒
有采取必要的隔離機制, 就會導致各種併發問題:
- 髒讀: 對於兩個事務 T1, T2, T1 讀取了已經被 T2 更新但還沒有被提交的字段. 之後, 若 T2 回滾, T1讀取的內容就是臨時且無效的.
- 不可重複讀: 對於兩個事務T1, T2, T1 讀取了一個字段, 然後 T2 更新了該字段. 之後, T1再次讀取同一個字段, 值就不同了.
- 幻讀: 對於兩個事務T1, T2, T1 從一個表中讀取了一個字段, 然後 T2 在該表中插入了一些新的行. 之後, 如果 T1 再次讀取同一個表, 就會多出幾行.
數據庫事務的隔離性: 數據庫系統必須具有隔離併發運行各個事務的能力, 使它們不會相互影響, 避免各種併發問題.
一個事務與其他事務隔離的程度稱爲隔離級別. 數據庫規定了多種事務隔
離級別, 不同隔離級別對應不同的干擾程度, 隔離級別越高, 數據一致性就
越好, 但併發性越弱.
數據庫提供的 4 種事務隔離級別:
Oracle 支持的 2 種事務隔離級別:READ COMMITED, SERIALIZABLE。 Oracle 默認的事務是第二個隔離級別爲: READ COMMITED
Mysql 支持 4 種事務隔離級別. Mysql 默認的事務是第三個隔離級別爲: REPEATABLE READ
- 查看隔離級別
select @@tx_isolation; - 設置隔離級別
set session|global transaction isolation level 隔離級別; - 開啓事務的語句;
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;
- 演示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;