spring中的事務管理

2021-06-15 00:27:32 字數 2726 閱讀 9693

一、簡單介紹

spring中的事務管理主要是用來管理對資料庫進行操作的事務,一般是應用於service層。分為幾種:

1.程式設計式事務管理(如jdbc中設定取消資料庫的自動提交功能)

conn=datasource.getconnection();

conn.setautocommit(false);//此處表示取消資料庫的自動提交功能,不要每條sql提交一次

... ...//此處是多條sql語句的處理

conn.commit()//在此處統一提交

2.宣告式事務管理

多數宣告式事務管理要比程式設計式來的方便,它能夠將事務管理**從業務邏輯中分離出來。例如通過aop對關注點進行橫切管理。可以通過aop對事務進行管理,在配置文件中進行。

3.更加常用的一種方式是spring中通過註解方式實現

注:事實上當事務管理器名字為transactionmanager時,就不需要加transaction-manager屬性,此處的事務管理器是

hibernatetransactionmanager,針對物件/關係對映框架訪問資料庫。當然其他的資料管理器還有datasourcetransaction(針對只有乙個資料來源)等。

在spring文件中注入了事務管理器之後,**中應該怎麼辦呢?

@transactional(propagation =propagation.required)

public list getassignmentlist(model model) //注:預設的事務傳遞方式就是

required

方式,因此上面的註解括號裡頭的可以不用寫。

詳細如圖:

二、下面介紹事務的傳遞方式

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

propagation_supports--支援當前事務,如果當前沒有事務,就以非事務方式執行。

propagation_mandatory--支援當前事務,如果當前沒有事務,就丟擲異常。

propagation_requires_new--新建事務,如果當前存在事務,把當前事務掛起。

propagation_not_supported--以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。

propagation_never--以非事務方式執行,如果當前存在事務,則丟擲異常。

三、 隔離方式(針對併發問題)

在併發環境中,乙個資料庫系統會同時為各種各樣的客戶程式提供服務。對於同時執行的多個事務,當這些事務訪問資料庫中的相同的資料時候,如果沒有採取必要的隔離機制,就會導致各種併發問題,這些併發問題可以歸納為以下幾類:

1、第一類丟失更新:撤銷乙個事務時,把其他事務已經提交的資料覆蓋。

2、髒讀:乙個事務讀到另乙個事務未提交的更新資料。(即另乙個事務最後rollback了)

3、虛讀:乙個事務讀到另乙個事務已提交的新插入的資料。

4、不可重複讀:乙個事務讀到另乙個事務已提交的更新資料。

5、第二類丟失更新:這是不可重複讀中的特例,乙個事務覆蓋另乙個事務已提交的更新。

資料庫系統採用鎖來實現事務的隔離性。鎖的基本原理如下:

1、當乙個事務訪問資料庫資源時,如果執行select語句,必須先獲得共享鎖;如果執行insert、update、delete語句,必須獲得獨佔鎖,這些鎖用於鎖定被操縱的資源。

2、當第二個事務也要訪問資料庫中的相同資源時,如果執行select語句,也必須獲得共享鎖,如果執行insert、update、delete語句,也必須獲得獨佔鎖。此時,第二個事務要根據鎖的型別來判斷應該等待第乙個事務解除對資源的鎖定,還是可以立刻獲得鎖。

以下是各種情況:

資源上已經放置鎖

第二個事務進行讀操作

第二個事務進行寫操作

立即獲得共享鎖

立即獲得獨佔鎖

共享鎖立即獲得共享鎖

等待第乙個事務解除獨佔鎖

獨佔鎖等待第乙個事務解除獨佔鎖

等待第乙個事務解除獨佔鎖

鎖機制可以有效地解決各種併發問題,但是它會影響併發的效能。併發效能越好,資料庫系統同時為各種客戶提供服務的能力就越強。當乙個事務鎖定資源時候,其他事務必須等待,這樣就降低了資料庫系統同時響應客戶程式的速度。因此我們要在事務的隔離性和併發性之間做權衡。資料庫系統提供了4種事務隔離級別:

1、serializable:序列化。

乙個事物已經訪問資料庫,那麼另乙個事務必須停下來等待,等第乙個事務結束後才能恢復執行。

2、repeatable read:可重複讀。

乙個事務在執行過程中可以看到其他事務已經提交的新插入的記錄,但是不能看到其他事務已經提交的對已有記錄的更新(能看到insert操作,不能看到update操作)。

3、read committed:讀取已提交資料。

乙個事務在執行過程中可以看到其他事務已經提交的新插入的記錄,而且能看到其他事務已經提交的對已有記錄的更新(能看到insert操作,也能看到update操作)。最常用。

4、read uncommitted:讀取未提交資料。

乙個事物在執行過程中可以看到其他事務沒有提交的新插入的記錄,而且能夠看到其他事務沒有提交的對已有記錄的更新。

從1到4,隔離級別越來越低,併發效能越來越高。

Spring中事務管理

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

Spring中事務管理

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

Spring中的事務管理

事務 本質上是乙個加鎖的概念,用來確保一組操作的時候 資料的完整性和一致性 乙個完整的事物需要滿足以下的特性 原子性 atomicity 事務的原子性確保動作要麼全部完成,要麼完全不起作用 一致性 consistency 一旦所有事務動作完成,事務就被提交。也就是說要麼都成功,要麼都不成功 隔離性 ...