使用TransactionScope执行选择

本文关键字:选择 执行 TransactionScope 使用 | 更新日期: 2023-09-27 17:57:40

我看到我的公司有很多人在做这件事:

var transactionOptions = new System.Transactions.TransactionOptions();
transactionOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted;
using (var transactionScope = new System.Transactions.TransactionScope(System.Transactions.TransactionScopeOption.Required, transactionOptions))
{
    try
    {
        using (DefaultContext ctx = new DefaultContext())
        {
            return ctx.Item.Where(x => x.State == 1);
        }
    }
    catch (Exception err)
    {
        throw err;
    }
    finally
    {
        transactionScope.Complete();
    }
}

我真的需要打开一个事务到Select并调用Complete()方法吗?我以为这只是为了修改数据。。。

有人可以向我解释这是否正确?这是个好主意还是坏主意?没有必要吗?

感谢

使用TransactionScope执行选择

因此,如果您对数据库做了很多事情,那么事务范围会很有用。假设您正在修改3个表。您修改了表1和表2,但当您尝试修改表3时,它失败了。如果第三次失败,您不希望保留表1和表2中所做的更改。这就是你将其封装在事务范围中的地方,因为如果出现错误,所有这些更改都会被回滚(或者更确切地说,不进行),你不必担心它

你可以在这里阅读更多。

不过,在事务范围中封装查询只是为了获取数据。。。我看不出有什么好处。你是对的,没有数据操作,所以真的不必有事务范围。我认为,你的一些同事刚刚看到别人使用了一个,他们决定如果他们也这样做,那将是一个好主意。

另一个奇怪的事实是,他们在finally中完成了事务范围。如果抛出错误,您可能不想完成事务。