[英]How to pass Dapper TransactionScope across multiple method
假設我有 2 種方法(A 和 B)
public void A()
{
using (var connection = Database.GetConnectionString())
using (var tran = new TransactionScope())
{
//do "A"
tran.Complete()
}
}
public void B()
{
using (var connection = Database.GetConnectionString())
using (var tran = new TransactionScope())
{
A(); //call "A"
//do "B"
tran.Complete()
}
}
如您所見,方法B
需要調用A
,但是A
和B
都已經有了自己的TransactionScope
,在這種情況下,傳遞TransactionScope
的正確方法是什么?
我的期望是當方法A
被調用時,它會
-。 開始傳輸
-。 做“一個”
-。 提交翻譯
當方法B
被調用時,它會
-。 開始傳輸
-。 做“一個”
-。 做“B”
-。 提交翻譯
任何幫助將不勝感激
TransactionScope
是環境的,默認支持邏輯嵌套(又名TransactionScopeOption.Required
); 所以通常你並不需要將它傳遞到任何地方——只要你(或 Dapper)打開 scope 內部的連接:它應該被包括在內。 當兩個這樣的TransactionScope
嵌套時:有效地提交內部事務什么都不做(中止內部事務會破壞整個事務) - 提交外部事務會提交整個事務。
但是,坦率地說,我通常建議使用顯式 ADO.NET 事務而不是TransactionScope
,在這種情況下,您確實需要將其傳入; 可選參數是你的朋友。
另外:請注意TransactionScope
與BEGIN TRAN
/ COMMIT TRAN
幾乎完全分開; 它是一種完全不同的事務表示方式(因為它需要支持不同系統上的分布式事務——通常通過 LTM 或 DTC)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.