一, 資料庫事務處理
事務處理是将多個操作或者指令一起執行,所有指令全部成功執行才意味着該事務的成功,任何一個指令失敗都意味着該事務的失敗。
是以,事務處理是不是一榮俱榮,而是一毀全毀。
事務的四大特征(ACID)
- 原子性(A):事務是最小的機關,不可再分
- 一緻性(C):事務要求所有的DML語句操作的時候,必須保證同時成功或者失敗
- 隔離性( I ):事務A與事務B之間具有隔離性
- 持久性(D):是事務的保證,事務終結的标志(記憶體的資料持久到硬碟檔案中)
二,事務語句
● BEGIN | Start Transaction:開啟事務
● SAVEPOINT 辨別名稱:保留點,每個保留點都表示它的唯一名字,以便以後回退。在MySQL事務中保留點越多越好,這樣能夠按照自己的意願靈活的進行回退。
● ROLLBACK 保留點辨別:復原到指定保留點處
● ROLLBACK:事務復原,整個事務復原
● COMMIT;送出事務,COMMIT送出或ROLLBACK復原後會關閉事務。
● SET AUTOCOMMIT = { 0 | 1 };設定事務自動送出,1自動,0取消自動
● 查詢自動送出功能狀态:SELECT @@AUTOCOMMIT;
事務使用:
BEGIN;#開啟事務
MDL語句;#事務失敗
ROLLBACK;#事務復原
--------------------------------------------
BEGIN;#開啟事務
MDL語句;#事務成功
COMMIT;#事務送出
三,隔離性-隔離級别
事務A與事務B之間具有一定的隔離性
隔離級别 | 非送出讀取(髒讀) | 不可重複讀取 | 幻想讀 |
READ UNCOMMITED 讀未送出 | ✔ | ||
READ COMMITED 讀已送出 | ✖ | ||
REPEATABLE READ 可重複讀 | |||
SERIALIZABLE 串行化 |
1)讀未送出:Read Uncommitted
- 事物A和事物B,事物A未送出的資料,事物B可以讀取到
- 這裡讀取到的資料叫做“髒資料”
- 這種隔離級别最低,這種級别一般是在理論上存在,資料庫隔離級别一般都高于該級别
2)讀已送出:Read Committed
- 事物A和事物B,事物A送出的資料,事物B才能讀取到 - 這種隔離級别高于讀未送出
- 換句話說,對方事物送出之後的資料,我目前事物才能讀取到
- 這種級别可以避免“髒資料”
- 這種隔離級别會導緻“不可重複讀取”
- Oracle預設隔離級别
3)可重複讀:Repeatable Read
- 事務A和事務B,事務A送出之後的資料,事務B讀取不到
- 事務B是可重複讀取資料
- 這種隔離級别高于讀已送出
- 換句話說,對方送出之後的資料,我還是讀取不到
- 這種隔離級别可以避免“不可重複讀取”,達到可重複讀取
- 比如1點和2點讀到資料是同一個
- MySQL預設級别
- 雖然可以達到可重複讀取,但是會導緻“幻像讀”
4)串行化:Serializable
- 事務A和事務B,事務A在操作資料庫時,事務B隻能排隊等待
- 這種隔離級别很少使用,吞吐量太低,使用者體驗差
- 這種級别可以避免“幻像讀”,每一次讀取的都是資料庫中真實存在資料,事務A與事務B串行,而不并發
設定隔離級别:
- 方法一:在my.ini檔案中使用transaction-isolation選項來設定事務伺服器的省缺事務隔離級别,例:transaction-isolation = READ-COMMITTED
- 方法二:通過動态指令設定隔離級别,在運作的伺服器中動态設定;SET [ GLOBAL | SESSION ] TRANSACTION ISOLATION LEVEL 隔離級别;
- 隔離級别的作用範圍:
- GLOBAL:全局級,對所有會話有效;SET GLOBAL TRANSACTION ISOLATION LEVEL 隔離級别;
- SESSION:會話級,隻對目前會話有效;SET SESSION TRANSACTION ISOLATION LEVEL 隔離級别;
檢視隔離級别:SHOW VARIABLES LIKE 'tx_isolation';