c# - 我需要 "transactionScope.Complete();"吗?

标签 c# sql .net sql-server linq-to-sql

据我所知,使用 TransactionScope 的“正确”方法是在退出 using< 之前始终调用 transactionScope.Complete();/ block 。像这样:

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省略它。所以我的问题是,是否必须使用它?

最佳答案

So my question is, must it be used or not?

Complete 在进行更新时必须使用 COMMIT 事务。否则,事务管理器将发出 ROLLBACK 并撤消所做的更改。

对于像您的示例这样的只读事务,我认为有或没有Complete 没有实质性区别。在这两种情况下,事务管理器发出的 COMMITROLLBACK 将具有释放事务持有的锁和资源的相同净效果。

虽然在只读事务中调用 Complete 不是必需的,但这仍然是恕我直言的最佳实践。想想那些后来无意中将数据修改代码添加到您的事务 block 而没有看到 Complete 丢失的可怜的开发人员。

关于c# - 我需要 "transactionScope.Complete();"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53657509/

相关文章:

c# - 为什么 .NET 中的排序集合没有匹配的接口(interface)?

c# - 如何在 java 中实现此 C# 通用接口(interface)?

sql - sql loader命令执行出错如何回滚?

mysql - 试图获取最近三个月的数据

带有 StringComparer 和德语变音符号的 .net SortedList

c# - 如何像保存图像一样保存 Canvas

c# - Decimal(18,2) 的最佳数据注释

sql - 配置单元:选择所有范围从一列的最大值开始的行

c# - 为派生的Model类创建不同的ViewModel对象

.net - 带边距的分组 WPF ListView 样式问题