复制事务功能时遇到问题



我正在更新一个在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();
}

所有这些函数只是格式化数据并将参数发送给数据库中的存储过程,这些存储过程在数据库上执行Select/Insert/Update操作。

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

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

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

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

当我试图建立这个,并使用它在我的开发环境,使用SQL 2008R2,我得到错误,如

"Uncommittable transaction is detected at the end of the batch"

"The server failed to resume the transaction"

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

任何想法,甚至方向在哪里看下一步将是美妙的!

谢谢!雅各

我认为问题是由于事务失败而没有被拒绝。当任何SQL查询失败时,都没有回滚调用。你检查过那些查询了吗?

最新更新