概述
- 在MySQL中只有使用了InnoDB數據庫存儲引擎的數據庫或表才支持事務。
- 事務處理能夠用來維護數據庫的完整性,保證成批的SQL語句要麼所有成功,要麼所有失敗。
- 事務用來管理DDL、DML、DCL操做,好比:insert、update、delete語句,默認是自動提交的。
通常來說,事務是必須知足4個條件(ACID)數據庫
- Atomicity(原子性)
- Consistency(一致性)
- Isolation(隔離性) -->由MVCC的鎖機制來實現的
- MVCC:優化讀寫性能(讀不加鎖,讀寫不衝突。不能優化讀讀和寫寫這種狀況)
- Durabolity(持久性)
對於ACID的解釋以下:session
- 原子性:構成事務的全部操做必須是一個邏輯單元,要麼所有成功,要麼所有失敗。
- 一致性:數據庫再事務執行先後狀態都必須是肯定的或者是一致的。
- 隔離性:事務之間不會相互影響。
事務支持
在MySQL命令行的默認設置下,事務都是自動提交的,既執行SQL語句後就會立刻執行COMMIT操做,所以要顯式地開啓一個事務必須使用命令BEGIN或START TRANSACTION,或者執行命令 SET AUTOCOMMIT=0,用來禁止使用當前會話的自動提交。併發
常見的操做
- BEGIN或START TRANSACTION:顯式地開啓一個事務;
- COMMIT也可使用COMMIT WORK,不過兩者是等價的,COMMIT會提交事務,並使已對數據庫進行的全部修改爲爲永久性的
- ROLLBACK也可使用ROLLBACK WORK,不過兩者是等價的,回滾回話結束用戶的事務,並撤銷正在進行的全部未提交的修改。
事務併發問題
在事務的併發操做中可能會出現一些問題:性能
- 丟失更新:一個事務更新以後,另外一個事務也更新了,可是第二個事務回滾了,則第一個事務也被回滾了
- 髒讀:一個事務讀取到另外一個事務未提交的數據
- 不可重複讀:一個事務因讀取到另外一個事務已提交的數據,致使對同一條記錄讀取兩次以上的結果不一致,update操做。
- 幻讀:一個事務因讀取到另外一個事務已提交的數據。致使對同一張表讀取兩次以上的結果不一致,insert、delete操做
事務隔離級別
爲了不上面出現的幾種狀況,在MySQL規範中,定義了4個事務隔離級別,不一樣隔離級別對事物的處理不一樣優化
由低到高:spa
- Read uncommitted(讀未提交):最低級別,任何狀況都沒法保證。
- Read committed(讀已提交):可避免髒讀的發生。
- Repeatable read(可重複讀):可避免髒讀,不可重複讀的發生。
- Serializable(串行化):可避免髒讀,不可重複讀,幻讀的發生。
默認隔離級別
大多數據庫的默認隔離級別是Read committed命令行
查看隔離級別
![](http://static.javashuo.com/static/loading.gif)
修改事務隔離級別
set [ global | session ] transaction isolation level Read uncommitted | Read committed | Repeatable | Serializable;
注意事項
隔離級別越高,越能保證數據的完整性和一致性,可是對併發性能的影響也越大。code
對於多數應用程序,能夠優先考慮把數據庫系統的隔離級別設置爲Read Committed。他可以避免髒讀,並且具備較好的併發性能,儘管他會致使不可重複度、幻讀這些併發問題,在可能出現這類問題的個別場合,能夠由應用程序採用悲觀鎖或樂觀鎖來控制。blog