创建 TransactionScope 和创建上下文顺序

Create TransactionScope and Create Context order

这些代码有什么区别:

using (TransactionScope tran = new TransactionScope ())
{
     using (Entities ent = new Entities())
     {

using (Entities ent = new Entities())
{
    using (TransactionScope tran = new TransactionScope ())
    {

行顺序重要吗?

谢谢

在这种情况下没关系,因为 Entities 看起来像模型/数据 class,它不能/不需要加入交易,所以你可以有任何订单,它不会产生差异。现在,如果 Entities 操作中存在任何问题,Read / DML 事务也会中止,假设操作发生在环境事务上下文中,尽管 class / 对象像 IDBConnection 无论如何都会自动登记到事务中(前提是未设置为 false),但是即使 Connection 是在事务上下文之外创建的,也不会自动登记,需要显式登记事务上下文

In Short

对于您当前的代码,直到您处理需要事务登记的对象(如 IDBConnection)之前,这并不重要。 在两个代码片段中,虽然我更喜欢第一个,其中环境事务全部包含所有需要自动登记的对象,但我们不会偶然留下任何对象。

Important Difference

您可能需要注意是否要访问事务上下文之外的实体,因为这在选项 1 中是不可能的,但在选项 2 中不会成为问题

是的,顺序很重要。或者更确切地说,我们不能在不查看您的代码的情况下说这无关紧要。

DbConnection 实例将存在于环境事务中,如果它们在 Open()ed 时存在的话。

您的 DbContext 构造函数可能会打开底层 DbConnection,在这种情况下,两种模式不同。

第一个是正常模式,你应该坚持。

此外,如果您正在使用 SQL 服务器,请不要使用 TransactionScope 的默认构造函数。参见 Using new TransactionScope() Considered Harmful