3 回答

TA貢獻(xiàn)2021條經(jīng)驗 獲得超8個贊
自問這個問題以來,我已經(jīng)進(jìn)行了一些測試,并且我自己找到了大多數(shù)(如果不是全部)答案,因為沒有其他人回答。如果我錯過了任何事情,請告訴我。
Q1。是的,除非在連接字符串中指定了“ enlist = false”。連接池找到可用的連接??捎眠B接是未在事務(wù)中登記的連接或在同一事務(wù)中登記的連接。
Q2。第二個連接是一個獨(dú)立的連接,它參與同一事務(wù)。我不知道關(guān)于這兩個連接命令的作用,因為他們是針對同一數(shù)據(jù)庫上運(yùn)行,但我認(rèn)為,如果命令是在同一時間上都發(fā)出了可能發(fā)生的錯誤:錯誤一樣在使用“事務(wù)上下文另一個會議”
Q3。是的,它升級為分布式事務(wù),因此即使使用相同的連接字符串,登記一個以上的連接也會導(dǎo)致它成為分布式事務(wù),可以通過在Transaction.Current.TransactionInformation中檢查非null GUID來確認(rèn).DistributedIdentifier。*更新:我讀到某處它在SQL Server 2008中已得到修復(fù),因此當(dāng)兩個連接使用相同的連接字符串時,只要不同時打開兩個連接,就不會使用MSDTC。這樣一來,您就可以在事務(wù)中打開連接并多次關(guān)閉它,這可以通過盡可能晚地打開連接并盡快關(guān)閉它們來更好地利用連接池。
Q4。否。當(dāng)沒有事務(wù)作用域處于活動狀態(tài)時打開的連接將不會自動加入新創(chuàng)建的事務(wù)作用域中。
Q5。不會。除非您在事務(wù)作用域中打開一個連接或在作用域中注冊一個現(xiàn)有連接,否則基本上沒有交易。您的連接必須自動或手動加入事務(wù)范圍中,以便命令參與事務(wù)。
Q6。是的,即使代碼恰好在已回滾的事務(wù)作用域塊中執(zhí)行,也不執(zhí)行不參與事務(wù)的連接上的命令也會被提交。如果連接不在當(dāng)前事務(wù)范圍內(nèi)征,它不參與交易,所以提交或回滾事務(wù)將會對交易范圍沒有征用的連接發(fā)出的命令沒有影響......因為這家伙發(fā)現(xiàn)。這是一個很艱巨察覺,除非你理解了自動征用過程:它僅在連接打開時里面一個活躍的事務(wù)范圍。
Q7。是。通過調(diào)用EnlistTransaction(Transaction.Current),可以在當(dāng)前事務(wù)作用域中明確加入現(xiàn)有連接。您還可以使用DependentTransaction在事務(wù)中的單獨(dú)線程上爭取一個連接,但是像以前一樣,我不確定同一事務(wù)中涉及同一數(shù)據(jù)庫的兩個連接如何相互作用……并且可能發(fā)生錯誤,并且當(dāng)然,第二個入伍連接會使事務(wù)升級為分布式事務(wù)。
Q8。可能會引發(fā)錯誤。如果使用TransactionScopeOption.Required,并且該連接已經(jīng)在事務(wù)范圍事務(wù)中登記,則沒有錯誤;實際上,沒有為該范圍創(chuàng)建新的事務(wù),并且事務(wù)計數(shù)(@@ trancount)不會增加。但是,如果使用TransactionScopeOption.RequiresNew,則嘗試在新事務(wù)作用域事務(wù)中注冊連接時會收到一條有用的錯誤消息:“連接當(dāng)前已注冊事務(wù)。完成當(dāng)前事務(wù)并重試?!?nbsp;是的,如果您完成了加入該連接的交易,則可以安全地將連接加入一個新的交易中。 更新:如果您以前在連接上調(diào)用BeginTransaction,當(dāng)您嘗試加入新的事務(wù)范圍事務(wù)時,會引發(fā)一個略有不同的錯誤:“由于連接上正在進(jìn)行本地事務(wù),因此無法加入事務(wù)。請完成本地事務(wù)并重試?!?nbsp;另一方面,您可以在SqlConnection進(jìn)入事務(wù)范圍事務(wù)中時安全地在SqlConnection上調(diào)用BeginTransaction,這實際上會將@@ trancount增加一個,這與使用嵌套事務(wù)范圍的Required選項不同,這不會導(dǎo)致它增加。有趣的是,如果您隨后使用Required選項繼續(xù)創(chuàng)建另一個嵌套事務(wù)范圍,則不會收到錯誤消息,
Q9。是。無論參與C#代碼中的活動事務(wù)作用域如何,命令都會參與連接所參與的任何事務(wù)。

TA貢獻(xiàn)1851條經(jīng)驗 獲得超4個贊
我們已經(jīng)看到了另一種奇怪的情況,那就是如果您構(gòu)建一個EntityConnectionStringBuilder
,它將與TransactionScope.Current
(并且我們認(rèn)為)參與該交易有關(guān)。我們已經(jīng)在調(diào)試器中觀察到了這一點(diǎn),其中TransactionScope.Current
的current.TransactionInformation.internalTransaction
表示enlistmentCount == 1
在構(gòu)造之前和enlistmentCount == 2
之后。
為了避免這種情況,請在內(nèi)部進(jìn)行構(gòu)造
using (new TransactionScope(TransactionScopeOption.Suppress))
可能不在您的操作范圍之內(nèi)(每次需要連接時,我們都會進(jìn)行構(gòu)建)
- 3 回答
- 0 關(guān)注
- 663 瀏覽
添加回答
舉報