你了解spring事務的傳播特性和隔離級別嗎

2021-09-22 20:12:49 字數 2236 閱讀 9991

這塊了解一些,首先spring一共定義了七種事務傳播屬性

1.propagation_required(支援當前事務,如果當前沒有事務,就新建乙個事務。這是最常見的選擇)

2.propagation_supports(支援當前事務,如果當前沒有事務,就以非事務方式執行)

3.propagation_mandatory(支援當前事務,如果當前沒有事務,就丟擲異常)

4.propagation_requires_new(新建事務,如果當前存在事務,把當前事務掛起)

5.propagation_not_supported(以非事務方式執行操作,如果當前存在事務,就把當前事務掛起)

6.propagation_never(以非事務方式執行,如果當前存在事務,則丟擲異常)

7.propagation_nested(如果當前存在事務,則在巢狀事務內執行。如果當前沒有事務,則進行與propagation_required類似的操作)】

但是在我個人平時的開發中接觸比較多的就是那個propagation_required,這種事務傳播特性可支援當前事務,如果當前沒有事務則會新建立乙個事務,打個比方說:有兩個方法methoda和methodb,如果這兩個方法都配置了該事務,當methoda方法內呼叫methodb方法時methodb是支援methoda事務的,同時如果methoda沒有事務,methodb有事務,那麼就會新建乙個事務。同時spring還定義了如propagation_supports、propagetion_never、propagation_requires_new等其他事物傳播特性。

事物隔級別這塊,spring共支援5種事物隔離級別,分別是

預設隔離級別(default:使用資料庫設定的隔離級別(預設),由dba預設的設定來覺得隔離級別)

讀未提交資料(read uncommited讀未提交資料:所有的事務都可以「看到」未提交事務的執行結果;會導致髒讀、不可重複讀和幻讀的問題的出現)

讀已提交資料(read commited讀已提交資料:乙個事務在開始時,只能"看見"已提交事務所做的改變;oracle和sql server預設的級別,可以避免髒讀,但不可重複讀和幻讀問題仍然會出現)

可重複讀(repeatable read可重讀:確保同一事務的多個例項在併發讀取資料時,會看到同樣的行,事務在讀取某資料的瞬間(就是開始讀取的瞬間),必須先對其加 行級共享鎖,直到事務結束才釋放;

事務在更新某資料的瞬間(就是發生更新的瞬間),必須先對其加 行級排他鎖,直到事務結束才釋放)

可序列化(serializable可序列化:最高的事務隔離級別,每個讀的資料上加上共享鎖

事務在讀取資料時,必須先對其加 表級共享鎖 ,直到事務結束才釋放;

事務在更新資料時,必須先對其加 表級排他鎖 ,直到事務結束才釋放)

這裡,不同的隔離級別,會出現不同的影響:

對於讀取未提交資料(read uncommited)來說,可能會出現髒讀、幻讀和不可重複讀

打個比方說:事務a執行update操作將字段name的值從小明更改為小黃,但是它沒有提交,這時事務b來讀資料庫,讀到的name等於小黃,如果事務a進行了事物回滾,這就對於事物b來說小黃是無效資料,也造成了髒讀。

對於讀已提交資料(read commited)來說,雖然避免了資料髒讀,但是也可能會造成幻讀的發生

比如:事務a對user表某一行進行讀取操作,讀到name=小明,這時事務b執行了update操作將字段name的值從小明更改為小黃,並在事務a未提交前已成功提交事務,此時對於事務a來說name真實的值不再是小明,這樣造成了資料幻讀。

但是對於可重複讀(repeatable read)來說,在同事務多例項的併發環境下可避免幻讀的產生,它是使用鎖機制實現的

比如說:在併發環境下,事務a在讀取某行資料時,會對這一行加行級共享鎖,該鎖僅僅對讀操作事務共享,這樣保證了當其他事務讀取到這行記錄時資料可達到一致,避免幻讀發生, 同時如果事務a對錶中某一行資料進行更改操作,那麼會對該行新增行級排它鎖,這把鎖會排斥其他事務對該行的修改操作,做到了資料一致性。

序列化(serializable):與可重讀的類似,它不是使用行級共享鎖或者行級排它鎖實現的,而是使用了表級共享鎖和表級排它鎖,相對可重讀的來說,支援的併發效率不高。

spring事務傳播

採用程式設計式事務 1 getcurrentsession 與opensession 的區別?採用getcurrentsession 建立的session會繫結到當前執行緒中,而採用opensession 建立的session則不會 採用getcurrentsession 建立的session在co...

Spring事務傳播

required 預設 如果當前存在事務,就加入該事務,如果不存在,則建立乙個新的事務 supports 如果呼叫者有事務,則加入該事務,如果沒有,則以非事務方式執行 mandatory 如果存在事務,則加入該事務,如果不存在事務,則拋異常 requires new 重新建立乙個新的事務,如果當前存...

Spring事務傳播

package org.springframework.transaction import org.springframework.lang.nullable public inte ce transactiondefinition 事務的傳播面向的是乙個方法在另乙個方法中執行時對事務的處理方式。...