事務控制語言 transaction control language
事務:一個或一組SQL語句組成一個執行單元,這個執行單元要麼全部執行要麼全部不執行
存儲引擎:
顯示存儲引擎SHOW ENGINES;
InnoDB 默認,支持事務
MyISM mysql5.5版本之前多用,不支持事務
MEMORY 多用,不支持事務
ACID
原子性(Atomicity):事務操作是一個不可分割的單位,事務操作要麼都發生要麼都不發生。
一致性(Consistency):事務必須使數據庫從一個一致性狀態到另一個一致性狀態。
隔離性(Isolation):事務執行不受其他事務干擾(隔離級別)
持久性(Durability):一個事務一旦被提交,數據庫的改變是永久的
事務創建
1、隱式事務:沒有開啓和結束標誌
如insert、update、delete
2、顯式事務
前提:設置自動提交功能禁用
步驟1:開啓事務
set autocommit =0;當前回話有效
start transaction; 命令行可不寫,禁用自動提交後自動執行
show variables like ‘autocommit’; 查看事務狀態
步驟2:編寫sql語句
語句1;
語句2;
。。。(select,insert,update,delete)
步驟3
commit;提交事務
rollback:回滾事務(出現異常使用,truncate刪除後不能回滾)
隔離級別
沒有隔離機制,會導致各種併發問題;
贓讀
例如:兩個事務T1,T2,T1讀取了T2已經更新但是還沒有提交的字段,T2回滾,T1再讀取的事務結果不一樣,之前讀取的內容就是臨時且無效的(可以扔掉的髒數據)
不可重複讀
例如:兩個事務T1,T2,T1從表中去讀字段,T2更新後,T1再讀,值不同
幻讀
例如:兩個事務T1,T2,T1讀取後T2插入數據,T1再讀出現了多幾行
數據庫四種隔離級別
read uncommitted 讀未提交
read commit 讀已提交
repeatable read 可重複讀
serializable 串行化
Oracle支持兩種事務隔離級別:read commit(默認)、serializable
Mysql支持四種事務隔離級別:repeatable read(默認)
命令行操作:
select @@tx_isolation; 查詢隔離級別
set session transaction isolation level 隔離級別; 設置隔離級別
set name 字符集; 改變字符集
savepoint 別名:保存點,回滾到某點
read uncommitted:都不能避免
read commit:避免贓讀
repeatable read:避免贓讀,不可重複讀
serializable:都避免