[英]Mixing Nhibernate and ADO transactions?
由於我繼承了一個代碼庫,因此我的要求很奇怪。 DAL基於存儲庫模式,但是某些存儲庫使用帶有直接SQL和參數化查詢的SqlConnection / SqlCommand進行編碼,而另一些使用NHibernate進行編碼。
我需要執行一系列數據操作,這些操作都需要兩個存儲庫,如果存儲庫在執行過程中的任何階段失敗,則都需要回滾。 最好的方法是什么?
System.Data公開一個IDbTransaction和NHibernate一個ITransaction,這兩個是否兼容? 我可以同時運行兩個事務,然后在出現問題時將它們都回滾嗎? 在這種情況下,TransactionScope會對我有幫助嗎?
nhibernate也支持sql語句 !
我似乎記得方法
NHibernateSession.CreateSQLQuery ,它返回IQuery (實際上是SQLQuery )
您可以繼續調用方法List或UniteResult
通常,編碼人員喜歡使用名為Hashtable的kv類
您可以在Nhibernate中使用ITransaction。
TransactionScope將創建一個掛鈎,該掛鈎將通過ADO.Net的所有組件使用。 由於所有 ORM都通過ADO.Net,因此它們都將隱式地接受TransactionScope。 諸如NHibernate,Linq,EF或您選擇的任何ORM之類的代碼無法抑制這一點,除非它們通過用新的作用域顯式覆蓋當前作用域來顯式抑制TransactionScope。
問題可能是由於由於向服務器中注冊了多個連接而導致事務升級到服務器上的分布式事務。 這是一個很滑的主題,受SQL Server / .Net版本的約束,請參閱System.Transactions與SQL Server的集成 。
我假設您想擁有類似於以下代碼:
public class SomeService
{
private readonly IRepositoryA _repoA;
private readonly IRepositoryB _repoB;
public void DoStuff(EntityA someEntityA, EntityB someEntityB)
{
try
{
_repoA.Save(someEntityA);
_repoB.Save(someEntityB);
// commit all stuff here
}
catch
{
// rollback all stuff here
}
}
}
如果確實如此,則您需要具有某種類型的UnitOfWork抽象,這兩個存儲庫都依賴於它們,並且可以為它們各自的事務上下文進行引用。 如果兩個存儲庫都使用Nhibernate或IDbConnection / DbTransactions,則會容易得多,但是由於存在混合,您將不得不做更多的工作。
您需要創建一個同時包含IDbTransaction和ITransaction的“ GenericTransaction”,並讓您的工作單元具有一種創建新GenericTransaction的方法。
GenericTransaction上的提交/回滾將對兩個事務執行相應的操作。
要正確執行此操作,您將不得不對現有的存儲庫進行相當多的重構……但是我不會推薦任何其他方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.