什麼是事務
事務用於保證數據的一致性,它由一組相關的dml語句組成,該組的dml語句要麼全部成功,要麼全部失敗。如:網上轉賬就是典型的要用事務來處理,用以保證數據的一致性。
事務和鎖
當執行事務操作時(dml語句),mysql會在被作用的表上加鎖,防止其它用戶改表表的結構.這裏對我們用戶來講是非常重要的。
提交事務
當執使用commit語句可以提交事務.當執行了commit語句子後,會確認事務的變化、結束事務、刪除保存點、釋放鎖,當使用commit語句結束事務子後,其它會話將可以查看到事務變化後的新數據
回退事務
在介紹回退事務前,我們先介紹一下保存點(savepoint)的概念和作用.保存點是事務中的一點.用於取消部分事務,當結束事務時,會自動的刪除該事務所定義的所有保存點.
當執行rollback時,通過指定保存點可以回退到指定的點,這裏我們作圖說明
mysql 數據庫控制檯事務的幾個重要操作
start transaction; //開始一個事務 (相當於set autocommit=0關閉自動提交。不同:如果事務結束了,成或敗,都會將自動提交機制,回到start狀態(初始狀態)。
savepoint 保存點名 ;//設置保存點
rollback to 保存點名; //取消部分事務
rollback; //失敗:取消全部事務
commit; // 成功: 提交事務.
提交或回滾。
在此基礎上,執行完所有的sql語句。
判斷是否都成功(出現錯誤,包括語法錯誤,和邏輯錯誤服務器錯誤)。
成:將結果提交,利用 commit
敗:回到開始位置。Rollback
事務的特性(ACID):
以銀行匯款爲例,張三給李四轉款300元.
1、原子性(Atomicity)
事務是一個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。
即:張三減300, 李四+300 , insert銀行流水, 這3個操作,必須都完成,或都不產生效果.
2、一致性(Consistency)
事務前後數據的完整性必須保持一致。
如:
(匯款前)張三的餘額+李四的餘額
(匯款後) 張三的餘額+李四餘額
比如: 張三隻有280元, 280-300=-20,儲蓄卡不是信用卡,不能爲負,因此張三餘0元.
將導致, 匯款後,2者餘額,匯款前,差了20元.
3、隔離性(Isolation)
多個用戶併發訪問數據庫時,一個用戶的事務不能被其它用戶的事物所幹擾,多個併發事務之間的數據要相互隔離。
4、持久性(Durability)
一個事務一旦被提交,它對數據庫中的數據改變就是永久性的。
事務的實現:
要求是事務支持的表類型
執行一組相關的操作前開啓事務
整組操作完成後,都成功,則提交,如果存在失敗,選擇回滾,則會回到事務開始的備份點。
隔離級別
查看隔離級別
mysql> show variables like '%isolation%';
設置事務的級別:
mysql> set session transaction isolation level read uncommitted;
set session transaction isolation level
[read uncommitted | read committed | repeatable read |serializable]
- read uncommitted(未提交讀): 事務的修改,即時沒有提交,對其他事務也都是可見的。事務可以讀取未提交的數據,稱爲
”髒讀(Dirty Read)”
。 在實際應用中一般很少用(不符原子性、對併發控制低)。 - read commited(提交讀): 這是大多數數據庫系統的默認隔離級別(但不是MySQL默認的)。一個事務從開始直到提交之前,所做的任何修改對其他事務都是不可見的。這個級別有時候也叫做不可重複讀(Non-Repeatable Reads),因爲兩次執行同樣的查詢,可能會得到不一樣的結果。
- repeatable read(可重複讀): repeatable read解決了髒讀的問題。該級別保證了在同一個事務中多次讀取同樣記錄的結果是一致的。但理論上,無法解決幻讀(Phantom Reads)的問題。所謂幻讀,指的是當某個事務在讀取某個範圍內的記錄時,另外一個事務又在該範圍內插入了新的記錄,當之前的事務再次讀取改範圍的記錄時,會產生幻行(Phantom Row)。InnoDB和XtraDB存儲引擎通過多版本併發控制(MVCC,Multiversion Concurrency Control)解決了幻讀的問題。(可重複讀是mysql的默認事務隔離級別)
- serializeable (可串行化):它通過強制事務串行,避免了幻讀問題。簡單來說,serializeable 會在讀取的每一行數據上加鎖,所以肯導致大量的超時和鎖爭用的問題。這樣隔離級別最高,但事務相互等待的等待長。在實用中,也不是很多。
隔離級別 | 髒讀可能性 | 不可重複讀可能性 | 幻讀可能性 | 加鎖讀 |
---|---|---|---|---|
read uncommitted | yes | yes | yes | no |
read commited | no | yes | yes | no |
repeatable read | no | no | yes | no |
serializeable | no | no | no | yes |