一、原子性
整個事務中的全部操做,要麼所有完成,要麼所有不完成,不可能停滯在中間某個環節。事務在執行過程當中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務歷來沒有執行過同樣。
二、一致性
在事務開始以前和事務結束之後,數據庫的完整性約束沒有被破壞。例如,完整性約束了a+b=10,一個事務改變了a,那麼b也應該隨之改變。
三、隔離性
兩個事務的執行是互不干擾的,一個事務不可能看到其餘事務運行時,中間某一時刻的數據。
四、持久性
在事務完成之後,該事務所對數據庫所做的更改便持久的保存在數據庫之中,並不會被回滾。
一、 髒讀(Drity Read):事務A修改了一個數據,但未提交,事務B讀到了事務A未提交的更新結果,若是事務A提交失敗,事務B讀到的就是髒數據。數據庫
同時也有髒讀也是最低級別的隔離級別。安全
爲了克服髒讀,SQL標註提出了第二個隔離級別:讀/寫提交:就是說一個事務只能讀取另外一個事務已經提交的事務併發
可是也會引起其餘問題性能
由於事務一不能讀取事務二未提交的事務,因此不知道餘額的變化過程,只能知道餘額最後變化的值,即餘額是一個變化的值。咱們稱之爲不可重複讀。 spa
二、不可重複讀(Non-repeatable read) : 在同一個事務中,對於同一份數據讀取到的結果不一致。好比,事務B在事務A提交前讀到的結果,和提交後讀到的結果可能不一樣。不可重複讀出現的緣由就是事務併發修改記錄,要避免這種狀況,最簡單的方法就是對要修改的記錄加鎖,這致使鎖競爭加重,影響性能。線程
爲了克服不可重讀帶來的錯誤,SQL標準又提出了一個隔離級別:可重複讀:針對數據庫的同一條記錄的讀/寫按照一個序列化操做,不會產生交叉狀況,保證數據一致性。blog
能夠認爲是鎖住這個記錄。事務
可是也會產生一些問題it
三、幻讀(Phantom Read) : 在同一個事務中,同一個查詢屢次返回的結果不一致。事務A新增了一條記錄,事務B在事務A提交先後各執行了一次查詢操做,發現後一次比前一次多了一條記錄。幻讀僅指因爲併發事務增長記錄致使的問題,這個不能像不可重複讀經過記錄加鎖解決,由於對於新增的記錄根本沒法加鎖。須要將事務串行化,才能避免幻讀。table
爲了克服幻讀,SQL推出更高的隔離級別----序列化
一、隨着隔離級別的提升,系統性能逐漸降低(「高風險,高回報」)。
二、序列化會嚴重抑制併發,從而引起大量的線程掛起,知道獲取鎖才能進行下一步操做,恢復時又須要等待大量的時間,可是數據絕對安全。
能夠在併發量不大但又保證數據安全性的情境下使用。
三、企業通常選擇讀/寫提交模式。
四、MySql支持4中隔離級別,默認爲可重複讀,Oracle支持讀/寫提交和可重複讀,默認爲讀/寫提交。
五、總之:隔離級別須要根據併發量的大小和性能來決定。