NHiberante原始碼分析之 事務

2021-04-23 05:16:30 字數 2471 閱讀 3337

對資料庫的操作是少不了事務處理的,事務能保整資料完整性和有效性。 在nh中,使用transaction物件對.net的事務物件(實現了idbtransaction介面的物件)進行了包裝。

在nh中,乙個典型的事務處理是這樣的(見isession.cs的注釋)

isession sess = factory.opensession();

transaction tx;

try  

catch (exception e)  

finally 

事務物件由session的begintransaction取得,同時事務開始,如果執行順利則提交事務,否則回滾事務。

先來看看事務物件的建立

public itransaction begintransaction() 

很簡單,直接呼叫事務工廠並開始事務。

public itransaction begintransaction(isessionimplementor session) 

構造乙個事務物件,並開始事務。

//*** transaction.cs 34行 ***

public

void begin() 

else 

} catch( exception e ) 

begun = true;

} 根據隔離級別啟動乙個事務,注意是從資料連線開始乙個事務哦。

從上面可以看出nh對資料庫事務的包裝是十分簡單的。

在這種典型的事務處理方法中,transaction依賴於乙個特定的session物件, 因為session關閉時將斷開資料連線,如果沒有提交事務,那麼事務是提交還是回滾是由具體的資料庫決定的, 但無論怎樣,事務都會結束。

這樣的話就存在乙個問題,在物件導向開發的情況下,可能有乙個事務操作的多個步驟分散在不同的物件中,為了保證此事務操作的原子性,顯然需要將session傳遞到各個步驟(方法)中,這樣才能保證所有步驟都在乙個session(事務)中處理。

在nh中,資料庫事務的生命週期是可以長於session的生命週期的,就是說資料庫事務不必依賴於乙個特定的session物件,這看起來不錯,我們不用再傳遞session物件了。注意,我這裡指的是資料庫事務(idbtransaction)。

下面就來實現這種事務處理方法,**如下:

isessionfactoryimplementor sfe = factory as isessionfactoryimplementor;

idbconnection conn = sfe.openconnection();

idbtransaction trans

trytrans = conn.begintransaction(); // 開始事務,這裡也可以設定事務隔離級別。

isession s = factory.opensession(conn); 

// do something

// ...

s.close();

isession s2 = factory.opensession(conn);

// do something

// ...

s2.close();

trans.commit(); // 提交事務

catch (exceptin ex)  

finally

首先取得資料庫連線,然後開始事務,接著建立會話處理業務操作,注意在建立會話的時候把資料加連線也傳遞了給去,這是必需的。上面**中最值的注意的就是會話的close操作了,這個操作在預設情況下是會關閉資料庫連線的,在這裡之所以沒有關閉連線,是因為opensession操作有帶乙個連線的緣故。

下面來看看nh中的相關**

public isession opensession(idbconnection connection) 

public isession opensession(idbconnection connection, iinterceptor interceptor) 

private isession opensession(idbconnection connection, bool autoclose, 

long timestamp, iinterceptor interceptor) 

這裡有乙個關健的引數autoclose, 它指session是否自動關閉資料庫連線。

public idbconnection close()  

finally 

}public idbconnection disconnect()  

else  

else  }} 

finally }}

從上面的**中可以看出,如果autoclose為true才會自動關閉連線。

這樣就實現了資料庫事務的生命週期長於會話生命週期的事務處理方法,至於這種方法有沒使用性,那就不好說了,因為要在opensession時使用資料庫連線,那麼如果我們把操作分散於各個物件之中的話,顯然必須傳遞資料庫連線或事務,但至少做到了資料庫事務與會話無關。

spring原始碼分析 spring原始碼分析

1.spring 執行原理 spring 啟動時讀取應用程式提供的 bean 配置資訊,並在 spring 容器中生成乙份相應的 bean 配置登錄檔,然後根據這張登錄檔例項化 bean,裝配好 bean 之間的依賴關係,為上 層應用提供準備就緒的執行環境。二 spring 原始碼分析 1.1spr...

思科VPP原始碼分析(dpo機制原始碼分析)

vpp的dpo機制跟路由緊密結合在一起。路由表查詢 ip4 lookup 的最後結果是乙個load balance t結構。該結構可以看做是乙個hash表,裡面包含了很多dpo,指向為下一步處理動作。每個dpo都是新增路由時的乙個path的結果。dpo標準型別有 dpo drop,dpo ip nu...

redux原始碼分析(三) 原始碼部分

下面是每個部分的一些解讀 createstore apicreatestore reducer,initialstate enhancer 曾經非常好奇這個函式的第二個引數到底是initialstate還是enhancer,因為見過兩種寫法都有的,以為是版本問題。看了原始碼才發現,都可以的。如果你不...