mysql事務(Transaction)介紹

什麼是事務

事務用於保證數據的一致性,它由一組相關的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)

一個事務一旦被提交,它對數據庫中的數據改變就是永久性的。

事務的實現:

  1. 要求是事務支持的表類型

  2. 執行一組相關的操作前開啓事務

  3. 整組操作完成後,都成功,則提交,如果存在失敗,選擇回滾,則會回到事務開始的備份點。

隔離級別

查看隔離級別

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]
  1. read uncommitted(未提交讀): 事務的修改,即時沒有提交,對其他事務也都是可見的。事務可以讀取未提交的數據,稱爲”髒讀(Dirty Read)”。 在實際應用中一般很少用(不符原子性、對併發控制低)。
  2. read commited(提交讀): 這是大多數數據庫系統的默認隔離級別(但不是MySQL默認的)。一個事務從開始直到提交之前,所做的任何修改對其他事務都是不可見的。這個級別有時候也叫做不可重複讀(Non-Repeatable Reads),因爲兩次執行同樣的查詢,可能會得到不一樣的結果。
  3. repeatable read(可重複讀): repeatable read解決了髒讀的問題。該級別保證了在同一個事務中多次讀取同樣記錄的結果是一致的。但理論上,無法解決幻讀(Phantom Reads)的問題。所謂幻讀,指的是當某個事務在讀取某個範圍內的記錄時,另外一個事務又在該範圍內插入了新的記錄,當之前的事務再次讀取改範圍的記錄時,會產生幻行(Phantom Row)。InnoDB和XtraDB存儲引擎通過多版本併發控制(MVCC,Multiversion Concurrency Control)解決了幻讀的問題。(可重複讀是mysql的默認事務隔離級別)
  4. 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章