当前位置:  开发笔记 > 编程语言 > 正文

TransactionScope如何回滚交易?

如何解决《TransactionScope如何回滚交易?》经验,为你挑选了2个好方法。

我正在编写一个集成测试,我将把一些对象插入数据库,然后检查以确定我的方法是否检索这些对象.

我与数据库的连接是通过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回滚交易呢?



1> JoshBerke..:

基本上,TransactionScope不会跟踪您的适配器,它的作用是跟踪数据库连接.当您打开数据库连接时,连接将查看是否存在环境事务(事务范围),如果存在,则查看它.注意如果与同一SQL服务器的连接多一个,那么它将升级为Distribtued Transaction.

由于您正在使用using块,因此即使发生异常,也会调用dispose.因此,如果在txScope.Complete()之前调用dispose,则TransactionScope将告诉连接回滚其事务(或DTC).


TransactionScope不跟踪线程上当前事务的任何内容,如果需要基于模型(需要,需要new等等),则修改它.该事务只是通知任何与其有关的内容,而不仅仅是数据库连接.

2> casperOne..:

TransactionScope班的工作原理与Transaction阶级,这是线程特定的.

TransactionScope被创建,它会检查是否有Transaction该线程; 如果存在,那么它使用它,否则,它创建一个新的并将其推入堆栈.

如果它使用现有的,那么它只增加一个计数器以释放(因为你必须调用Dispose它).在最后一个版本中,如果Transaction没有进行评论,它将回滚所有工作.

至于为什么类似乎神奇地了解了事务,那么这就是那些希望使用这个模型的类的实现细节.

在创建deptAdapteremptAdapter实例时,它们会检查线程上是否有当前事务(类上的静态Current属性Transaction).如果存在,那么它将自己注册Transaction,以参与提交/回滚序列(它Transaction控制,并可能传播给不同的事务协调器,如内核,分布式等).


它如何与范围内创建的SqlConnection一起使用?SqlConnection类是否在内部使用Transaction类,而Transaction类又与TransactionScope一起使用?或者它是否直接进入TLS?
推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有