【发布时间】:2019-05-08 12:15:04
【问题描述】:
据我了解,使用TransactionScope 的“正确”方法是在退出using 块之前始终调用transactionScope.Complete();。像这样:
using (TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted }))
{
//...
//I'm using this as a NOLOCK-alternative in Linq2sql.
transactionScope.Complete();
}
但是,我已经看到代码在没有它的情况下也可以工作,甚至the answer I've learnt to use it from 也忽略了它。所以我的问题是,是否必须使用它?
【问题讨论】:
-
Complete 基本上设置了一个标志,上面写着“我很好”,就是这样。如果你不设置它,并且没有其他代码设置它(不要忘记这种事务可能是分布式的),那么事务将保持怀疑,直到事务管理器决定最终结果是什么。
-
TransactionScope 最初基于 Microsoft Transaction Server (MTS)。它成为 COM“服务”(今天也称为“组件服务”)的一部分。它的根 COM 接口是 IObjectContext。 IObjectContext 位于“上下文/事务/活动”的两个内部/不可见标志“提交”和“完成”上,并具有设置/取消设置这两个标志的方法。调用 transactionScope.Complete 等效于调用 IObjectContext.SetComplete()。
标签: c# sql .net sql-server linq-to-sql