Spring 事物的隔離級別與傳播行為

2021-09-02 22:29:15 字數 1717 閱讀 6548

注:

1、事務的隔離級別和資料庫併發性是成反比的,隔離級別越高,併發性越低。

2、對於不同的資料庫,支援的隔離級別也不一樣:oracle只能支援讀寫提交和序列化,而mysql能夠支援4種,對於oracle預設的隔離級別為讀寫提交,mysql則是可重複讀。 

3、註解@transactional的底層實現是spring aop技術,而spring aop技術使用的是動態**。這就意味著對於靜態(static)方法和非public方法,註解@transactional是失效的。

事物的acid原則:

原子性:事務裡面的操作單元不可切割,要麼全部成功,要麼全部失敗 

一致性:事務執行前後,業務狀態和其他業務狀態保持一致. 

隔離性:乙個事務執行的時候最好不要受到其他事務的影響 

永續性:一旦事務提交或者回滾.這個狀態都要持久化到資料庫中

隔離級別(isolation)

含義:允許乙個事物讀取另乙個事物沒提交的資料。

缺點:出現髒讀;假設庫存為2,事物a扣減庫存1但還未提交,此時事物b讀取a未提交的資料為1,如果此時a回滾,那麼b讀取到的資料就是髒資料,它的任何修改操作將會產生錯誤。

@transactional(isolation = isolation.read_uncommitted)
含義:乙個事務只能讀取另外乙個事務已提交的更改資料。該級別克服了髒讀。

缺點:不可重複讀;假設庫存為2,事物a扣減庫存1但還未提交,此時事物b讀物庫存仍為2,同時a提交了,庫存變為了1,那麼此時b在庫存為2的基礎上做的修改操作將會產生錯誤

@transactional(isolation = isolation.read_committed)
含義:乙個事務不會修改已經由另乙個事務讀取但未提交(回滾)的資料。克服讀寫提交中出現的不可重複讀的現象

缺點:會出現幻讀。

@transactional(isolation = isolation.repeatable_read)
注意:不可重複讀和幻讀的區別是:前者是指讀到了已經提交的事務的更改資料(修改或刪除),後者是指讀到了其他已經提交事務的新增資料。

含義:是資料庫最高的隔離級別,它能夠完全保證資料的一致性,但效能降低了。

傳播行為(pragation)

含義:事務傳播行為用來描述由某乙個事務傳播行為修飾的方法被巢狀進另乙個方法的時事務如何傳播。

如果有事務, 那麼加入事務, 沒有的話新建乙個(預設情況下)

容器不為這個方法開啟事務

不管是否存在事務,都建立乙個新的事務,原來的掛起,新的執行完畢,繼續執行老的事務

必須在乙個已有的事務中執行,否則丟擲異常 

必須在乙個沒有的事務中執行,否則丟擲異常(與propagation.mandatory相反)

如果其他bean呼叫這個方法,在其他bean中宣告事務,那就用事務.如果其他bean沒有宣告事務,那就不用事務.

在當前方法呼叫子方法時,如果子方法發生異常,只回滾子方法執行過的sql,而不回滾當前方法的事務。

注:常用的傳播行為主要有三種:required 、requires_new、 nested

@transactional註解

預設傳播行為:required

預設隔離級別:預設使用資料庫的隔離級別

Spring 的事物隔離級別

sql標準定義了4類隔離級別,包括了一些具體規則,用來限定事務內外的哪些改變是可見的,哪些是不可見的。低階別的隔離級一般支援更高的併發處理,並擁有更低的系統開銷。read uncommitted 讀取未提交內容 在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,因...

事物隔離級別

自然也是支援四種事務隔離級別的 read uncommitted,read commit,repeatable read serializable,下面就分別最四種隔離級別在實現的鎖機制做乙個簡介 serializable 1 這種隔離級別對資料的要求最為嚴格,自然也是效能最差的一種隔離級別。在所有...

事物隔離級別

隔離級別從松到緊 讀未提交,讀提交 重複讀,序列化。讀未提交 可能會出現髒讀的情況 例子 你去買5個包子。人多。店員拿的急多方乙個,袋子裡有6個,這個時候,你眼睛一瞟。心裡美滋滋。付錢的時候老闆檢查了一下,發現多了乙個,就拿走了乙個,然後你付錢走人 提交事務 這時候你就發現實際上袋子裡只有5個,但是...