springboot事務處理

2021-10-11 03:07:25 字數 2699 閱讀 9993

事務隔離性的4個級別,

1、讀未提交(read uncommitted)

讀未提交是資料庫應保證的最低的隔離性級別:事務中的修改,即使沒有提交,對其他事務也都是可見的。

讀未提交面臨髒讀的問題:事務可以讀取未提交的資料,而該資料可能在未來因回滾而消失。從效能上來說,讀未提交不會比其他的級別好太多,但卻缺乏其他級別的很多好處。除非真的有非常必要的理由,在實際應用中很少使用。

2、讀已提交(read committed)

讀已提交滿足前面提到的隔離性的簡單定義:乙個事務所做的修改在最終提交以前,對其他事務是不可見的。換句話說,一旦提交,該事務所作的修改對其他正在進行中的事務就是可見的。

狹義上,讀已提交解決了髒讀的問題。這個級別有時候叫做不可重複讀,面臨不可重複讀的問題:兩次執行同樣的查詢,如果第二次讀到了其他事務提交的結果,則會得到不一樣的結果。

大多數資料庫的預設隔離級別都是read committed,但mysql不是。
3、可重複讀(repeatable read)

在讀已提交的基礎上,可重複讀解決了部分不可重複的問題:同乙個事務中多次讀取同樣記錄結果是一致的。記錄指具體的資料行。

未能解決的那部分稱為幻讀:當某個事務在讀取目標範圍內的記錄時,另乙個事務又在該範圍內插入了新的記錄,當之前的事務再次讀取該範圍的記錄時,會產生第一次讀取範圍時不存在的幻行(phantom row)。需要注意的是,只有插入會產生幻行。

mysql的預設隔離級別是可重複讀,有幻讀問題。
4、可序列化(serializable);

可序列化是最高的隔離級別:強制事務序列化執行。

可序列化解決了幻讀問題。簡單來說,可序列化會在目標範圍加獨佔鎖,將併發讀寫相同範圍資料的請求序列化。可序列化會導致大量的超時和鎖爭用問題,因此,實際應用中很少用到這個隔離級別,只有在非常需要確保資料的一致性而且可以接受沒有併發的情況下,才考慮採用該級別。

基於鎖的併發控制中,4種隔離性級別的實現原理。重點關注讀鎖(read lock,或稱共享鎖)、寫鎖(write lock,或稱排它鎖)、範圍鎖(range lock)、鎖的持有時間等概念。

讀鎖又稱為共享鎖,共享鎖就是多個事務共享一把鎖,都能訪問到資料,但都只能讀不能修改。

寫鎖又稱為排他鎖,排他鎖和其他事務不能共存,如果乙個事務獲取了乙個資料行的排他鎖,其他的事務不可以再獲取到該資料行的任何鎖,獲取到排他鎖的資料行可以對行進行讀取和修改,沒有獲取到鎖的資料行 不能 讀取和修改。

mysql的innodb引擎預設修改的語句都會加上排他鎖,比如update insert delete

範圍鎖針對目標範圍,一般是指sql語句中where約束的範圍

我們可以看org.springframework.transaction.annotation.isolation列舉類中定義了五個表示隔離級別的值:

public

enum isolation

1、default:這是預設值,表示使用底層資料庫的預設隔離級別。對大部分資料庫而言,通常這值就是:read_committed。

2、read_uncommitted:該隔離級別表示乙個事務可以讀取另乙個事務修改但還沒有提交的資料。該級別不能防止髒讀和不可重複讀,因此很少使用該隔離級別。

3、read_committed:該隔離級別表示乙個事務只能讀取另乙個事務已經提交的資料。該級別可以防止髒讀,這也是大多數情況下的推薦值。

4、repeatable_read:該隔離級別表示乙個事務在整個過程中可以多次重複執行某個查詢,並且每次返回的記錄都相同。即使在多次查詢之間有新增的資料滿足該查詢,這些新增的記錄也會被忽略。該級別可以防止髒讀和不可重複讀。

5、serializable:所有的事務依次逐個執行,這樣事務之間就完全不可能產生干擾,也就是說,該級別可以防止髒讀、不可重複讀以及幻讀。但是這將嚴重影響程式的效能。通常情況下也不會用到該級別。

所謂事務的傳播行為是指,如果在開始當前事務之前,乙個事務上下文已經存在,此時有若干選項可以指定乙個事務性方法的執行行為。

我們可以看org.springframework.transaction.annotation.propagation列舉類中定義了6個表示傳播行為的列舉值:

public

enum propagation

1、required:如果當前存在事務,則加入該事務;如果當前沒有事務,則建立乙個新的事務。預設型別

2、supports:如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續執行。

3、mandatory:如果當前存在事務,則加入該事務;如果當前沒有事務,則丟擲異常。

4、requires_new:建立乙個新的事務,如果當前存在事務,則把當前事務掛起。

5、not_supported:以非事務方式執行,如果當前存在事務,則把當前事務掛起。

6、never:以非事務方式執行,如果當前存在事務,則丟擲異常。

7、nested:如果當前存在事務,則建立乙個事務作為當前事務的巢狀事務來執行;如果當前沒有事務,則該取值等價於required。

指定方法:通過使用propagation屬性設定,例如:

@transactional

(propagation = propagation.required)

Springboot全域性事務處理

什麼是全域性事務spring boot spring 事務是通過aop aop相關術語 通知 advice 連線點 joinpoint 切入點 pointcut 切面 aspect 目標 target proxy 織入 we ing 切面程式設計來實現的,此時我們就可以對指定的包的service的方...

Spring Boot資料訪問 事務處理

事務管理對於企業應用來說是至關重要的,當出現異常情況時,它也可以保證資料的一致性。所謂事務的傳播行為是指,如果在開始當前事務之前,乙個事務上下文已經存在,此時有若干選項可以指定乙個事務性方法的執行行為。在propagation定義中包括了如下幾個表示傳播行為的常量 隔離級別越高,越能保證資料的完整性...

PB事務處理

1 資料視窗更新,只要dberror有錯誤,而事先沒有做過任何commit工作,那麼rollback可以回滾到上次commit位置,即上次commit後所有的資料將被回滾。2 如果是直接寫入sql語句,只要資料庫出現錯誤,那麼rollback可以回滾到上次commit的位置,即上次commit後所有...