复制事务'功能的麻烦
本文关键字:功能 麻烦 事务 复制 | 更新日期: 2023-09-27 18:02:43
我正在更新一个在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查询失败时,都没有回滚调用。你检查过那些查询了吗?