当一个数据库是SQL Server CE时,如何将TransactionScope与两个数据库一起使用
本文关键字:数据库 TransactionScope 一起 两个 一个 SQL Server CE | 更新日期: 2023-09-27 18:20:12
我有两个数据库:dbGlobal是SQL Server 2008
,dbLocal是SQL Server 2008 CE
。出于业务原因,我需要将一些数据保留为用户的本地数据,而将其他数据保留为所有用户的全局数据。在许多情况下,我会在dbLocal中有一个表,它有一个引用dcGlobal中表的列。在我的C#代码中,我希望在事务中进行某些数据库操作。
我已经读到单个TransactionScope
对象可以处理两个数据库连接。我认为,如果这两个数据库连接中的一个连接到SQLServerCE实例,则可能不会出现这种情况。这是真的吗?这是我的代码:
using (TransactionScope scope = new TransactionScope())
{
using (DataContext dcGlobal = new DataContext(Program.dbGlobal),
dcLocal = new DataContext(Program.dbLocal))
{
ITable<tblDbGlobal> tblGlobal = dcGlobal.GetTable<tblDbGlobal>();
ITable<tblDbLocal> tblLocal = dcLocal.GetTable<tblDbLocal>();
//Invalid Operation Exception here
var join = from tGlobal in tblGlobal.ToList()
join tLocal in tblLocal.ToList() on
tGlobal.PkDbGlobal equals tLocal.FkDbGlobal
select new { tGlobal.Name, tLocal.Gender };
foreach (var item in join)
{
Console.WriteLine(string.Format("{0}, {1}", item.Name, item.Gender));
}
}
}
当我运行此代码时,我会在var join ...
行得到一个Invalid Operation Exception
,其中包含消息"无法在事务范围中登记连接对象"。
当dcLocal在localhost上运行时,dcGlobal在网络上的另一台计算机上运行。我仔细检查了两台计算机上是否都在运行MS DTC(分布式事务控制器),并确保安全设置几乎允许任何操作。我还关闭了两台电脑上的windows防火墙。
我试着使用DTCPing工具,但我遇到了一些错误。如果我在另一台计算机的DTCPing程序中键入每台计算机的完整名称,则不会发生任何事情。我既没有收到成功也没有收到失败的信息。我可以整天点击PING按钮。
如何为这两个数据库设置事务?
我意识到,对于选择查询,我可能不需要事务范围。我只是举个例子。我将有更复杂的查询,涉及插入、更新和删除,这些查询应该发生在可以跨越两个数据库的事务中
您不能将分布式事务与SQL Server Compact一起使用http://msdn.microsoft.com/en-us/library/bb896149.aspx