spring原始碼之事務上篇

2022-05-20 20:34:14 字數 2290 閱讀 7015

本篇之前,已經寫過關於aop的原始碼分析,在此基礎上來閱讀事務的原始碼是比較清晰的。另外,需要對資料庫有一定的了解,我們所說是事務一般指的都是狹義的事務,即資料庫事務。文中沒有特別指出的資料庫,均指的是mysql,後面再來寫一篇關於mysql的鎖和事務的文章。

事務指的是乙個程式執行單元,這個執行單元要麼成功,要麼失敗,絕對不允許存在中間狀態,它是我們恢復和併發控制的基本單位。

學習spring事務時,我們一般會從事務特性、隔離級別、傳播行為三個進行分析

學習事務時,一般會拿轉錢來做說明,這裡也拿張三向李四轉100元來說明,這個過程分為兩步,張三帳戶減100,李四帳戶加100.

事務的四個特性(acid)

mysql資料庫的隔離級別

事務級別越高,資料的完整性和一致性越好,但對併發效能的影響也越大。innodb預設repeatable read。

分為以下四個級別,每個級別都是來解決特點問題的

read committed,·寫成read uncommitted data更合適,讀到已提交的資料,避免了髒讀,會有不可重複讀

repeatable read:重複讀,避免了髒讀、不可以重複讀,會有幻讀

serializable:序列讀,事務乙個個執行,避免了髒讀、不可重複讀,幻讀 

和資料庫對應四個級別,再加上預設級別,共五個

//transactiondefinition的屬性
int isolation_default = -1;

int isolation_read_uncommitted =connection.transaction_read_uncommitted;

int isolation_read_committed =connection.transaction_read_committed;

int isolation_repeatable_read =connection.transaction_repeatable_read;

int isolation_serializable = connection.transaction_serializable;

//connection的屬性
int transaction_read_uncommitted = 1;

int transaction_read_committed = 2;

int transaction_repeatable_read = 4;

int transaction_serializable = 8;

服務介面方法巢狀呼叫時, spring通過事務傳播行為控制當前的事務如何傳播到被巢狀呼叫的目標服務介面方法中。

下面從原始碼中看到有七種,我們常用的就是propagation_required

//transactiondefinition的屬性
//如果當前存在事務,就加入該事務,如果沒有事務,則建立五個新事務

intpropagation_required = 0

;//如果當前存在事務,就加入該事務,如果沒有事務,就以非事務的方法執行

int propagation_supports = 1;

//如果當前存在事務,就加入該事務,如果沒有事務,就丟擲異常

int propagation_mandatory = 2;

//不管當前事務存在事務,都建立新事務

int propagation_requires_new = 3;

//不管當前是否存在事務,都以非事務方法執行

int propagation_not_supported = 4;

//以非事務方式執行,如果當前存在事務,就丟擲異常

int propagation_never = 5;

//如果當前存在事務,則以巢狀事務方式執行,如果不事務,則新建乙個事務

int propagation_nested = 6;

首先配置配置乙個datasource,這裡就不貼**了,這裡配置了,可能在我們實際中開發中並不會配置這個,這裡拿出來是為了後面的原始碼分析

class="org.springframework.jdbc.datasource.datasourcetransactionmanager">

propagation="required" rollback-for="exception,runtimeexception"/>

for="exception,runtimeexception"/>

for="exception,runtimeexception"/>

NHiberante原始碼分析之 事務

對資料庫的操作是少不了事務處理的,事務能保整資料完整性和有效性。在nh中,使用transaction物件對.net的事務物件 實現了idbtransaction介面的物件 進行了包裝。在nh中,乙個典型的事務處理是這樣的 見isession.cs的注釋 isession sess factory.o...

Redis原始碼分析之事務

redis是通過multi discard exec watch四個命令來實現事務的。事務提供了一種將多個命令打包,然後一次性並順序的執行所有命令的機制,並且事務在執行中不會主動中斷,伺服器只有在事務執行完後,才會繼續執行其他客戶端的請求。下面是乙個事務的例子 redis multi okredis...

Spring事務 之 事務自動提交

一 mysql 資料庫事務自動提交 對於mysql資料庫,預設情況下,資料庫處於自動提交模式。每一條語句處於乙個單獨的事務中,在這條語句執行完畢時,如果執行成功則隱式的提交事務,如果執行失敗則隱式的回滾事務。對於正常的事務管理,是一組相關的操作處於乙個事務之中,因此必須關閉資料庫的自動提交模式,下面...