复制事务的功能有困难

时间:2013-03-06 22:09:00

标签: c# sql transactions

我正在更新在Live环境中正在使用和正在使用的当前程序,它会保存客户和订单,然后将它们导出到旧数据库。所有报告仍在旧系统中完成,而新系统中的报告系统正在开发中,这就是为什么这些都需要导出。

该程序有一个内置的C#TransactionManager,用于在一个事务中将多个从C#调用到SQL的调用。每当我尝试复制这个时,我都会收到错误而无法正常工作。

这里有代码,工作:

using (ITransactionInfo trx = this.TransactionManager.BeginTransaction())
{
    //
    // Update the customer. If the customer doesn't exist, then create a new one.
    //
    this.SaveCustomer(Order);

    //
    // Save the Order.
    //
    this.Store.SaveCorporateOrder(Order, ServiceContext.UserId);

    //
    // Save the Order notes and the customer notes.
    //
    this.NotesService.AppendNotes(NoteObjectTypes.CorporateOrder, Order.Id, Order.OrderNotes);
    this.NotesService.AppendNotes(NoteObjectTypes.Customer, Order.Customer.Id, Order.CustomerNotes);

    //
    // Export the Order if it's new.
    //
    this.ExportOrder(Order, lastSavedVersion);

    //
    // Commit the transaction.
    //
    trx.Commit();
}

所有这些功能只是格式化数据并将参数发送到数据库中的存储过程,以便在数据库上执行选择/插入/更新操作。

SaveCustomer存储过程将客户保存到新数据库。

SaveCorporateOrder存储过程获取由Save Customer存储过程写入的信息,并使用它将Order保存到新数据库。

ExportOrder存储过程获取由前两个存储过程写入的信息,并将Order导出到旧数据库。

如果@@ TRANCOUNT == 0并且最后有一个commit语句,则每个存储过程都包含启动新事务的代码。由于C#中的事务,似乎没有使用这些,但是没有代码将事务信息或连接信息传递给我可以看到的存储过程。这在SQL 2005服务器上正在使用。

当我尝试构建它并在使用SQL 2008R2的开发环境中使用它时,我会收到类似

的错误
"Uncommittable transaction is detected at the end of the batch"

"The server failed to resume the transaction"

似乎每个人都在启动它自己的事务,并且无法从之前的未提交事务中读取数据,而不是看到它在同一个事务中。我不知道不同的SQL版本是否可能导致它以不同的方式工作,但完全相同的代码在Live安装中有效,但在我的Dev环境中无效。

任何想法,甚至指向下一步的方向都会很精彩!

谢谢! -Jacob

1 个答案:

答案 0 :(得分:0)

我认为问题是因为交易失败而且没有被拒绝。当任何SQL查询失败时,您没有针对该情况的回滚调用。你检查过这些问题吗?