事務(Transaction)是併發控制的單位,是用戶定義的一個操做序列。這些操做要麼都作,要麼都不作,是一個不可分割的工做單位。經過事務,數據庫能將邏輯相關的一組操做綁定在一塊兒,以便服務器保持數據的完整性。
在深刻了解今天的主題以前,須要瞭解事務的有哪些特性? 事務有四大特性,簡稱ACID。
1. 原子性(Atomicity)java
原子性是指事務是一個不可分割的工做單位,事務中的操做要麼所有成功,要麼所有失敗。好比在同一個事務中的SQL語句,要麼所有執行成功,要麼所有執行失敗。
2. 一致性(Consistency)mysql
一致性是指在事務開始以前和事務結束之後,數據庫的完整性約束沒有被破壞。
例如:A+B=100,AB和的狀態必須始終保持100。若A=80,則B=20,若A=70,則B=30,他們的和在事務結束先後必須是一致的。
3. 隔離性(Isolation)sql
事務的隔離性是多個用戶併發訪問數據庫時,數據庫爲每個用戶開啓的事務,不能被其餘事務的操做數據所幹擾,多個併發事務之間要相互隔離
4. 持久性(Durability)數據庫
持久性是指一個事務一旦被提交,它對數據庫中數據的改變就是永久性的,接下來即便數據庫發生故障也不該該對其有任何影響
先回憶一下java多線程下的安全性,假設有一變量count初始值爲100,此時有線程A和線程B同時對變量count進行操做。線程A進行操做: count = count +1,在線程A賦值以前,CPU的執行權切換到線程B,此時線程B讀取到的count仍然爲100,線程B進行操做: count = count +2。
那麼出現的問題就顯而易見了,最後執行操做的線程回覆蓋前者。而咱們在java中的一般作法是給代碼塊加鎖或者變量定義爲 AtomicInteger類型的原子性變量。回到mysql,該如何實現呢?
假設有一銀行帳戶count,小明和小強對其同時進行操做。以下圖:
安全
爲了保證小明在存款時小強不能取現,或者小強在取現時小明不能存款,須要作一個互斥操做!即須要加一個排他鎖(Exclusive Lock) , 簡稱X鎖。以下圖:
服務器
髒讀就是指當一個事務正在訪問數據,而且對數據進行了修改,而這種修改尚未提交到數據庫中,這時,另一個事務也訪問這個數據,而後使用了這個數據。
因爲只在寫數據的時候加鎖但並未在讀數據的時候加鎖,致使小強讀取到了回滾以前的數據。解決方案顯而易見,和上面同樣加一個X鎖不就得了嗎?可是僅僅讀取數據就加X鎖,有點影響性能。 因此,這裏爲此有專門針對於讀數據的鎖,即共享鎖(Share lock),簡稱S鎖。當一個數據加了X鎖, 就無法加S鎖, 一樣加了S鎖, 就無法加X鎖。
多線程
不可重複讀指在一個事務內讀取表中的某一行數據,屢次讀取結果不一樣。
如圖所述,解決髒讀的方案很是簡單,在同一事務讀取數據時只有把數據讀取完才釋放鎖便可!併發
虛讀(幻讀)是指在一個事務內讀取到了別的事務插入的數據,致使先後讀取不一致。
一個事務用Where子句來檢索一個表的數據,另外一個事務插入一條新的記錄而且符合Where條件,這樣,第一個事務用同一個where條件來檢索數據後,就會多出一條記錄!例如:性能目前工資爲1000的員工有10人。
1.事務1,讀取全部工資爲1000的員工。
2.這時事務2向employee表插入了一條員工記錄,工資也爲1000
3.事務1再次讀取全部工資爲1000的員工 共讀取到了11條記錄。
不可重複讀的重點是修改 : 一樣的條件, 你讀取過的數據,再次讀取出來發現值不同了幻讀的重點在於新增或者刪除: 一樣的條件, 第 1 次和第 2 次讀出來的記錄數不同.測試
mysql數據庫默認的事務隔離級別是:Repeatable read(可重複讀)
mysql數據庫設置事務隔離級別:set transaction isolation level 隔離級別名
查看當前數據庫的事務隔離級別:
select @@tx_isolation;
結果以下圖,能夠清晰的發現當前數據庫默認的隔離級別爲:REPEATABLE-READ
爲了驗證上面聊到的數據庫由於隔離級別的不一樣而形成的不一樣後果,開啓如下演示!下面以髒讀爲例:
1.更改當前數據庫的事務隔離級別,並開啓事務。
set transaction isolation level read uncommitted; start transaction;
2.在當前窗口A查詢count的值,結果爲100
3.從新開啓一個窗口B,開啓事務而且更新數據
start transaction; update account set count = count + 20 where id = 1;
4.切回到窗口A查詢count的值,結果爲120 ,此時讀取到了窗口B中還沒有提交的事務。
至於其餘演示,本文就暫不作贅述,方法都大同小異。
本人以筆記總結爲主,簡單概述了事務的四大特性及事務的隔離級別。最後將以幻讀爲切入點,下篇文章講講MVCC的的概念