Spring事務那些事兒

2021-10-03 00:06:40 字數 2365 閱讀 8224

不可重複讀和幻讀的區別:

不可重複讀指在同一事務中多次查詢同一記錄(eg:select * from xx where id = 1),查詢結果不一致。這主要是由於多次讀期間其他事務update或delete了記錄。

幻讀是指在同一事務中多次進行範圍查詢(eg:select count(*) from xx where id > 1 and id < 100),查詢結果不一致。這主要是由於多次範圍查詢期間其他事務insert了新資料。

在一般的事務場景中通常有以下幾個參與者:

rm:用於管理系統資料資源,即通常意義上的資料庫伺服器等。

tp monitor:主要用於分布式事務,用來協調處理多個rm的事務處理。

tm:事務的管理者,負責事務界定、事務上下文傳播等功能。

我們通常會根據rm的數量將事務分為分布式事務和區域性事務(本地事務)兩種。 在分布式事務中通常會存在多個不同的rm,這些rm分布在不同的系統中,相互之間通過tp monitor協調,利用兩階段提交來保障事務的acid屬性。在區域性事務中一般每次資料操作只有乙個rm,資料操作只需操作乙個資料庫,在同乙個事務中不會進行多個資料庫的更新。接下來我們將著重介紹區域性事務的實現,畢竟分布式事務我懂的也不多?。

1.事務原理簡介

首先我們需要了解的很重要的一點是,spring的事務底層實現本質上是依賴於其使用的資料庫伺服器,例如mysql資料庫。在mysql資料庫中事務的隔離依賴於mysql的鎖機制,永續性和原子依賴於redo日誌,而一致性依賴於undo日誌。mysql提供事務功能的具體實現,spring負責界定事務的邊界及定義事務的傳播性,然後通過特定的資料訪問技術(例:jdbc、hibernate等)的api對事務進行管理。

我們以jdbc舉個簡單的例子,我們可以看下面的**:

connection connection = null;

boolean rollback = false;

try catch (sqlexception e) finally else

}

這就是我們利用jdbc進行的最簡單的事務管理,將autocommit置為false,然後根據各種情況進行事務的回滾提交等操作。而我們平時普通的資料操作都是預設自動提交,mysql會自動隱式的幫我們commit事務。

但是上面的寫法在實際的開發中存在很多的問題:1.不同的數資料訪問技術有不同的api、2.我們需要自己手動捕獲處理各種以sql異常、3.事務管理**和資料訪問**及業務**耦合在一起。

2.spring事務框架重要類

為了解決上面提到的問題,spring為我們提供了優秀的事務框架。我們先來介紹下事務框架中重要的類:

頂層介面

職責transactiondefinition

用來定義事務屬性,包括事務的隔離性、傳播性、超時時間、是否唯讀等屬性。

transactionstatus

用來記錄事務開啟到事務結束期間事務的狀態,這個類一般在程式設計式事務中使用。

platformtransactionmanager

spring事務框架的核心類,負責事務的管理,包括事務的commit、rollback等。

3.spring事務傳播性

事務傳播性

說明required

業務方法需要在乙個事務中執行,如果方法執行時,已處在乙個事務中,那麼就加入該事務,否則自己建立乙個新的事務,這是spring預設的傳播行為。

supports

如果業務方法在某個事務範圍內被呼叫,則方法成為該事務的一部分,如果業務方法在事務範圍外被呼叫,則方法在沒有事務的環境下執行。

mandatory

只能在乙個已存在事務中執行,業務方法不能發起自己的事務,如果業務方法在沒有事務的環境下呼叫,就拋異常。

requires_new

業務方法總是會為自己發起乙個新的事務,如果方法已執行在乙個事務中,則原有事務被掛起,新的事務被建立,直到方法結束,新事務才結束,原先的事務才會恢復執行。

not_supported

宣告方法需要事務,如果方法沒有關聯到乙個事務,容器不會為它開啟事務。如果方法在乙個事務中被呼叫,該事務會被掛起,在方法呼叫結束後,原先的事務便會恢復執行。

never

宣告方法絕對不能在事務範圍內執行,如果方法在某個事務範圍內執行,容器就拋異常。只有沒關聯到事務,才正常執行。

nested

如果乙個活動的事務存在,則執行在乙個巢狀的事務中。如果沒有活動的事務,則按required屬性執行。它使用了乙個單獨的事務,這個事務擁有多個可以回滾的保證點。內部事務回滾不會對外部事務造成影響, 它只對datasourcetransactionmanager 事務管理器起效。

鏈結那些事兒

鏈結,就是將不同部分的 和資料收集和組合成為乙個單一檔案的過程,這個檔案可被載入到儲存器中執行。鏈結可以執行於編譯時 compile time 也就是源 被翻譯成機器 時 eg.普通的鏈結器鏈結,以及靜態鏈結庫,由靜態鏈結器鏈結 也可以執行於載入時 例如動態鏈結庫的載入時鏈結 也可以執行於執行時 r...

指標那些事兒

1.野指標 也叫懸擺指標,迷失指標 野指標是導致bug的罪魁禍首之一。對指標呼叫delete後 釋放掉了它指向的記憶體,野指標還是指向原來的位址 如果沒有重新賦值就使用它,將導致難以預料的後果。因為此時操作野指標,它指向的記憶體位址可能已經分配給其他變數在使用了。所以指標在delete之後,如果不再...

遞迴那些事兒

include include include include 求階乘 int fac int n if n 1 求累加 int add int n 求字串長度 int my strlen const char dest int main 遞迴注意事項 遞迴雖然經典,但是也有他的缺點 第一 遞迴是反...