一尘不染

TransactionScope如何回滚事务?

c#

我正在编写一个集成测试,该测试将在数据库中插入许多对象,然后检查以确保我的方法是否检索到这些对象。

我与数据库的连接是通过NHibernate进行的,而创建此类测试的常用方法是执行以下操作:

NHibernateSession.BeginTransaction();

//use nhibernate to insert objects into database
//retrieve objects via my method
//verify actual objects returned are the same as those inserted

NHibernateSession.RollbackTransaction();

但是,我最近发现了TransactionScope,显然可以用于此目的…

我发现的一些示例代码如下:

public static int AddDepartmentWithEmployees(Department dept)
{

    int res = 0;

    DepartmentAdapter deptAdapter = new DepartmentAdapter();
    EmployeeAdapter empAdapter = new EmployeeAdapter();
    using (TransactionScope txScope = new TransactionScope())
    {

        res += deptAdapter.Insert(dept.DepartmentName);
        //Custom method made to return Department ID 
        //after inserting the department "Identity Column"
        dept.DepartmentID = deptAdapter.GetInsertReturnValue();
        foreach(Employee emp in dept.Employees)
        {

            emp.EmployeeDeptID = dept.DepartmentID;
            res += empAdapter.Insert(emp.EmployeeName, emp.EmployeeDeptID);

        }
        txScope.Complete();

    }
    return res;

}

我相信,如果不包括这一行txScope.Complete(),插入的数据将被回滚。但是不幸的是,我不明白这是怎么可能的……
txScope对象如何跟踪数据库中的deptAdapterempAdapter对象及其事务。

我感觉好像在这里丢失了一些信息…我真的能够通过使用?包围我的代码来替换我BeginTransaction()和(RollbackTransaction()调用TransactionScope

如果不是,那么如何TransactionScope回滚事务?


阅读 671

收藏
2020-05-19

共1个答案

一尘不染

本质上,TransactionScope不会跟踪适配器的,它会跟踪数据库连接。当您打开数据库连接时,连接将查看是否存在环境事务(事务作用域),如果有,请注册它。警告:如果到同一SQL
Server的连接只有多个,它将​​升级为Distribtued Transaction。

由于您正在使用using块,因此会发生什么情况,您可以确保即使发生异常也将调用dispose。因此,如果在txScope.Complete()之前调用dispose,那么TransactionScope将告诉连接回滚其事务(或DTC)。

2020-05-19