TRANSACTION(事務隔離級別)數據庫
在說明事務隔離級別以前先說一下髒讀、不可重複讀、幻讀這三個概念。併發
髒讀:一個事務讀取到另外一事務未提交的更新新據。當一個事務正在訪問數據,而且對數據進行了修改,而這種修改尚未
提交到數據庫中,這時,另一個事務也訪問這個數據,而後使用了這個數據。由於這個數據是尚未提交的數據, 那麼另
外一個事務讀到的這個數據是髒數據,依據髒數據所作的操做也多是不正確的。spa
不可重複讀:在同一事務中,屢次讀取同一數據返回的結果有所不一樣。換句話說就是,後續讀取能夠讀到另外一事務已提交的
更新數據。相反,「可重複讀」在同一事務中屢次讀取數據時,可以保證所讀數據同樣,也就是,後續讀取不能讀到另外一事務
已提交的更新數據。code
幻讀:事務T1執行一次查詢,而後事務T2新插入一行記錄,這行記錄剛好能夠知足T1所使用的查詢的條件。而後T1又使用相同
的查詢再次對錶進行檢索,可是此時卻看到了事務T2剛纔插入的新行。這個新行就稱爲「幻像」,由於對T1來講這一行就像忽然
出現的同樣。blog
1. ISOLATION_DEFAULT:這是一個PlatfromTransactionManager默認的隔離級別,使用數據庫默認的事務隔離級別。
每種數據庫的默認隔離級別是不一樣的,例如SQL Server、Oracle默認Read Commited,MySQL默認Repeatable Read。
另外四個與JDBC的隔離級別相對應,不一樣的隔離級別採用不一樣的鎖類型來實現,在四種隔離級別中,Serializable的
隔離級別最高,Read Uncommited的隔離級別最低。事務
2. ISOLATION_READ_UNCOMMITTED:讀未提交數據,這是事務最低的隔離級別,在併發的事務中,它充許一個事務能夠
讀到另外一個事務未提交的更新數據。(會出現髒讀,不可重複讀和幻讀)it
3. ISOLATION_READ_COMMITTED:讀已提交數據,保證在併發的事務中,一個事務修改的數據提交後才能被另一個事
務讀取到。(會出現不可重複讀和幻讀)io
4. ISOLATION_REPEATABLE_READ:可重複讀,這種事務隔離級別能夠防止髒讀,不可重複讀。可是可能出現幻讀。通常
是採用「快照」的方式來實現的。table
5. ISOLATION_SERIALIZABLE:事務被處理爲順序執行。這是花費最高,但也是最可靠的事務隔離級別。能有效的避免髒讀、
不可重複讀、幻讀。class
PROPAGATION(事務傳播屬性)
PROPAGATION_REQUIRED:支持當前事務,若是當前沒有事務,就新建一個事務。也就是說業務方法須要在一個事務中運行,若是
業務方法被調用時,調用業務方法的行爲(方法)已經處在一個事務中,那麼就加入到該事務,不然爲本身建立一個新的事務。
(默認傳播屬性)
PROPAGATION_SUPPORTS:支持當前事務,若是當前沒有事務,就以非事務方式執行。也就是說若是業務方法在某個事務範圍內被調用,
則該方法成爲該事務的一部分。若是業務方法在事務範圍外被調用,則該方法在沒有事務的環境下執行。
PROPAGATION_MANDATORY:支持當前事務,若是當前沒有事務,就拋出異常。也就是說業務方法只能在一個已經存在的事務中執行,
業務方法不能發起本身的事務。若是業務方法在沒有事務的環境下被調用,容器就會拋出例外。
PROPAGATION_REQUIRESNEW:新建事務,若是當前存在事務,把當前事務掛起。也就是說業務方法被調用時,無論是否已經存在事務,
業務方法總會爲本身發起一個新的事務。若是調用業務方法的行爲(方法)已經運行在一個事務中,則原有事務會被掛起,新的事務
會被建立,直到業務方法執行結束,新事務纔算結束,原先的事務纔會恢復執行。
PROPAGATION_NOT_SUPPORTED:以非事務方式執行,若是當前存在事務,就把當前事務掛起。也就是說業務方法不須要事務。若是
方法沒有被關聯到一個事務中,容器不會爲它開啓事務。若是方法在一個事務中被調用,該事務會被掛起,在方法調用結束後,
原先的事務便會恢復執行。
PROPAGATION_NEVER:以非事務方式執行,若是當前存在事務,則拋出異常。也就是說業務方法絕對不能在事務範圍內執行。若是業務
方法在某個事務中執行,容器會拋出例外,只有業務方法沒有關聯到任何事務,才能正常執行。
PROPAGATION_NESTED:若是一個活動的事務存在,則運行在一個嵌套的事務中。 若是沒有活動事務, 則按REQUIRED屬性執行。
它使用了一個單獨的事務, 這個事務擁有多個能夠回滾的保存點。內部事務的回滾不會對外部事務形成影響。它只對
DataSourceTransactionManager事務管理器起效。
數據庫事務的4個特性:
原子性(Atomic):組成一個事務的多個數據庫操做是一個不可分割的原子單元;只有全部操做執行成功,整個事務才提交,
其中一個操做失敗,都必須回滾到初始狀態。
一致性(Consistency):事務操做成功後數據庫所處的狀態和它的業務規則是一致的;(即數據總額不會被破壞。
如A帳戶轉帳100到B帳戶,不管操做成功與否,A和B的存款總額是不變的)
隔離性(Isolation):在併發數據操做時,不一樣的事務擁有各自的數據空間,它們的操做不會對彼此產生干擾。(並不是是徹底無干擾,
根據數據庫的隔離級別,會產生不一樣程度的干擾)
持久性(Durability):一旦事務提交成功,事務中的數據操做都必須持久化到數據庫中;就算數據庫崩潰,也必須保證有某種機制恢復。
在這些特性中,數據「一致性」是最終目標,其餘的特性都是爲了達到這個目標的措施和手段。
MYSQL查看當前事務隔離級別
select @@tx_isolation,@@global.tx_isolation;