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# - mvc 经典 sql 与 EF

c# - 想要避免在传递给 Composite 的 Strategy 中向下转型

c# - 要合并的大小不等的列表

SQL 别名无法识别

sql - 无法删除 PostgreSQL 角色。错误 : `cannot be dropped because some objects depend on it`

c# - 是否可以使用 LINQ 检查列表中的所有数字是否单调递增?

.net - 通过代码将域添加到 Azure 网站

c# - 共享 Windows 主机上的 Windows 服务

sql - 如何计算 SQL 表中的所有枚举

.net - 如何在调试.NET项目的命令行参数中使用宏?