Spring中的事務管理

2021-08-21 03:54:38 字數 3668 閱讀 8397

1.   事務概述

事務(transaction)是訪問並可能更新資料庫中資料的程式執行單元,通常事務開始(begin transaction)和事務結束(end transaction)之間執行的全體操作組成。例如我們平時的轉賬操作,從開始執行轉賬,到收款使用者確認收款,最終金額增加,這就是乙個事務。

為什麼我們要加入事務管理?借助以上的轉賬例項來進行說明,假設a向b賬戶轉賬100元,那麼最基本的兩個操作就是a賬戶的金額減少100元,然後b賬戶的金額增加100元,存在一定的先後順序。倘若在a完成轉賬之後,a的金額減少了100元,但是資訊傳輸途中發生了某些異常,導致b沒有接受到轉賬資訊,那麼b的金額沒有增加。最終的結果是a的金額減少了100元,而b的維持不變。這樣的場景不符合我們日常生活的實際,因此我們引入事務管理,一旦在事務發生中斷,事務立即回滾到開始之前的狀態,也就是a減少的那100元金額會退還到a的賬戶。

事務作為乙個不可分割的邏輯工作單元,一般具備acid四大特性:

1)  原子性(乙個事務中的多個操作要麼都成功要麼都失敗)

2)  一致性(乙個事務必須讓資料庫從乙個一致性狀態到另乙個一致性狀態,簡單地舉例就是轉賬前後兩個人的總金額應該不變)

3)  隔離性(事務與事務之間應該互不干擾)

4)  永續性(事務一旦提交,它對資料庫的改變是永久性的)

2.   spring事務管理

spring為我們提供了兩種事務管理方式。一種是通過編碼實現的程式設計式事務,另一種是基於spring aop的宣告式事務。宣告式事務管理通過切面實現將具體業務邏輯與事務處理解耦,使業務**邏輯不受汙染, 因此在實際使用中宣告式事務用的比較多。

spring中宣告式事務處理有兩種方式,一種是在配置檔案(xml)中做相關的事務規則宣告,另一種是基於@transactional 註解的方式。

2.1註解模式的事務管理

首先,我們在spring容器中配置乙個事物管理的bean物件,datasourcetransactionmanager物件,這裡也有兩種方式,一種是在配置類中配置(全註解模式),另一種是在spring配置檔案中配置(半註解模式)。

配置類中配置事物管理類,首先要開啟spring註解驅動的事務管理,可以通過在類名上方新增@ enabletransactionmanagement註解的方式實現,然後在這個類中配置事務管理物件,這裡的datasource要與資料庫連線的資料來源保持一致:

@bean("transactionmanager")

public datasourcetransactionmanager getdatasourcetransactionmanager(

datasource ds)

xml配置檔案中配置管理類並開啟事物管理模式:

配置好事務管理註解以後,就可以在類或者方法上使用@transactional進行事務管理。當把@transactional註解加在類上時,表示類中的所有public修飾的方法全都配置相同的事物管理資訊。當@transactional修飾方法時,表示方法對方法進行事物管理。這裡需要注意兩點:一是@transactional只能用來修飾public許可權的方法,其餘的不起作用;二是如果類和類裡的方法都是用了@transactional註解,方法上的事無屬性優先級別較高,會覆蓋類上的相關設定。

@transactional註解後表示啟動spring預設的事務管理模式,也可以新增一些屬性來對方法採取不同的事務管理模式,下面總結了一些常用的屬性:

value:當在配置檔案中有多個 transactionmanager , 可以用該屬性指定選擇哪個事務管理器。

propagation:事務的傳播行為,預設值為 required。

isolation:事務的隔離度,預設值採用 default。

timeout:事務的超時時間,預設值為-1。如果超過該時間限制但事務還沒有完成,則自動回滾事務。

read-only :指定事務是否為唯讀事務,預設值為 false;為了忽略那些不需要事務的方法,比如讀取資料,可以設定read-only 為 true。

rollback-for:用於指定能夠觸發事務回滾的異常型別,如果有多個異常型別需要指定,各型別之間可以通過逗號分隔。

no-rollback- for:丟擲 no-rollback-for 指定的異常型別,不回滾事務。

2.2spring配置檔案中的事務管理

配置檔案中配置事物管理可以分為三步。

1)在spring配置檔案中配置事務管理器:

也可以針對某一方法進行特殊設定:

3)配置事物切面,這裡設定的一種細粒度的事物管理,對service中的所有方法進行管理,還有一種粗粒度的事務管理,expression=」within("

com.jt.manage

.service..*")

」管理的是

service

包中的所有類。

3.spring事物拓展

3.1spring事物傳播特性

事務傳播特性(propagation):事務方法之間相互呼叫時,事務的傳播方式。

@transactional(propagation=propagation.required) 如果沒有事務建立新事務, 如果當前有事務參與當前事務,這是事物管理的預設方式,也是需要重點掌握的。

@transactional(propagation=propagation.supports)支援事務, 如果沒有事務也不會建立新事務,也是比較常用的,一般用在查詢方法中。

@transactional(propagation=propagation.requires_new)必須是新事務, 如果有當前事務, 掛起當前事務並且開啟新事務。

@transactional(propagation=propagation.mandatory)必須有事務, 如果當前沒有事務就拋異常。

@transactional(propagation=propagation.never)絕對不能有事務, 如果在事務中呼叫則丟擲異常。

@transactional(propagation=propagation.nested)必須被巢狀到其他事務中。

@transactional(propagation=propagation.not_supported)不支援事務。

3.2事物隔離級別

總所周知,併發訪問時程式需要解決的乙個重要問題,當多個事物併發執行時,可能會引發髒讀、不可重複讀和幻讀等問題。髒讀是乙個事務中讀取到另乙個事務沒有提交的資料。不可重複讀是在乙個事務中兩次查詢的結果不一樣(針對update操作)。幻讀是在乙個事務中兩次查詢的結果不一樣(針對insert操作)。

當多個事務併發執行時,可通過設定事務的隔離級別保證事務的完整性,一致性。

事務的隔離級別從低到高有如下幾種方式:

1)read_uncommitted (此級別可能會出現髒讀)

2)read_committed(此級別可能會出現不可重複讀)

3)repeatable_read(此級別可能會出現幻讀)

4)serializable(多事務序列執行)

spring中一般採用@transactional(isolation=isolation.read_committed) 方式宣告級別, 這種方式是併發效能和安全性折中的選擇,是大多數軟體專案採用的隔離級別。

Spring中事務管理

spring提供的事務管理可以分為兩類 程式設計式的和宣告式的。程式設計式的,比較靈活,但是 量大,存在重複的 比較多 宣告式的比程式設計式的更靈活。傳統使用jdbc的事務管理 以往使用jdbc進行資料操作,使用datasource,從資料來源中得到connection,我們知道資料來源是執行緒安全...

Spring中事務管理

一 事務 1.事務邏輯上的一組操作,組成這組操作的各個邏輯單元,要麼一起成功,要麼一起失敗 2.事務特性 1 原子性 強調事務的不可分割 2 一致性 事務的執行的前後資料的完整性保持一致 3 隔離性 乙個事務執行過程中,不應該收到其他事務的干擾 4 永續性 事務一旦結束,資料就持久到資料庫中 3.事...

spring中的事務管理

一 簡單介紹 spring中的事務管理主要是用來管理對資料庫進行操作的事務,一般是應用於service層。分為幾種 1.程式設計式事務管理 如jdbc中設定取消資料庫的自動提交功能 conn datasource.getconnection conn.setautocommit false 此處表示...