事務的產生,其實是為了當應用程式訪問資料庫的時候,事務能夠簡化我們的程式設計模型,不需要我們去考慮各種各樣的潛在錯誤和併發問題.可以想一下當我們使用事務時,要麼提交,要麼回滾,我們不會去考慮網路異常了,伺服器宕機了,同時更改乙個資料怎麼辦對吧?
事務的提交是指事務裡的所有操作都正常完成。
事務的回滾是指程式或資料處理錯誤,將程式或資料恢復到上一次正確狀態的行為。
簡而言之,事務就是去解決各種各樣的潛在錯誤和併發問題.
在我們剛開始學習或者沒有spring幫我們管理事務時候,我們**是這樣的
connection conn = drivermanager.
getconnection()
;try
catch
(exception e)
finally
事務:邏輯上的一組操作,組成這組操作的各個單元,要麼全都成功,要麼全都失敗。
原子性:事務不可分割
一致性:事務執行前後資料完整性保持一致
隔離性:乙個事務的執行不應該受到其他事務的干擾
永續性:一旦事務結束,資料就持久化到資料庫
讀問題
髒讀 :乙個事務讀到另乙個事務未提交的資料
不可重複讀 :乙個事務讀到另乙個事務已經提交的update的資料,導致乙個事務中多次查詢結果不一致
虛讀、幻讀 :乙個事務讀到另乙個事務已經提交的insert的資料,導致乙個事務中多次查詢結果不一致。
寫問題
丟失更新
設定事務的隔離級別
read uncommitted :未提交讀,任何讀問題解決不了。
read committed :已提交讀,解決髒讀,但是不可重複讀和虛讀有可能發生。
repeatable read :重複讀,解決髒讀和不可重複讀,但是虛讀有可能發生。
serializable :解決所有讀問題。
平台事務管理器:介面,是spring用於管理事務的真正的物件。
datasourcetransactionmanager :底層使用jdbc管理事務
hibernatetransactionmanager :底層使用hibernate管理事務
事務狀態:用於記錄在事務管理過程中,事務的狀態的物件。
spring進行事務管理的時候,首先平台事務管理器根據事務定義資訊進行事務的管理,在事務管理過程中,產生各種狀態,將這些狀態的資訊記錄到事務狀態的物件中。
spring中提供了七種事務的傳播行為:
保證多個操作在同乙個事務中
propagation_required :預設值,如果a中有事務,使用a中的事務,如果a沒有,建立乙個新的事務,將操作包含進來
propagation_supports :支援事務,如果a中有事務,使用a中的事務。如果a沒有事務,不使用事務。
propagation_mandatory :如果a中有事務,使用a中的事務。如果a沒有事務,丟擲異常。
保證多個操作不在同乙個事務中
propagation_requires_new :如果a中有事務,將a的事務掛起(暫停),建立新事務,只包含自身操作。如果a中沒有事務,建立乙個新事務,包含自身操作。
propagation_not_supported :如果a中有事務,將a的事務掛起。不使用事務管理。
propagation_never :如果a中有事務,報異常。
巢狀式事務
propagation_nested :巢狀事務,如果a中有事務,按照a的事務執行,執行完成後,設定乙個儲存點,執行b中的操作,如果沒有異常,執行通過,如果有異常,可以選擇回滾到最初始位置,也可以回滾到儲存點。
spring提供了兩種事務管理的方式:程式設計式事務管理和宣告式事務管理,這裡我們看一下宣告式事務管理.
Spring事務的管理
1 程式設計式事務管理 通過 transactiontemplate或者transactionmanager手動管理事務,實際應用中很少使用 第一種 使用transactiontemplate 進行程式設計式事務管理的示例 如下 autowired private transactiontempla...
spring的事務管理
spring宣告式事務讓我們從複雜的事務處理中得到解脫。使得我們再也無需要去處理獲得連線 關閉連線 事務提交和回滾等這些操作。再也無需要我們在與事務相關的方法中處理大量的try catch finally 我們在使用spring宣告式事務時,有乙個非常重要的概念就是事務屬性。事務屬性通常由事務的傳播...
Spring的事務管理
手動編碼的方式完成事務管理 需要事務管理器 真正管理事務物件.spring提供了事務管理的模板 工具類.第一步 註冊事務管理器 id transactionmanager class org.springframework.jdbc.datasource.datasourcetransactionm...