我正在多个数据库上执行数据更改,我想实现一个涵盖所有更改的事务。
这就是我目前所拥有的:
try
{
db[1].begintransaction();
db[1].ExecuteNonQuery();
db[2].begintransaction();
db[2].ExecuteNonQuery();
...
db[N].begintransaction();
db[N].ExecuteNonQuery();
// will execute only if no exception raised during the process
for (int a = 0; a < N; a++)
{
db[a].Commit();// what if there is an error/exception here
}
}
catch
{
for (int a = 0; a < N; a++)
{
db[a].RollBack();
}
}
问题是,如果在Commit()
期间发生异常,上述情况将会非常失败(请参阅评论)。有没有更好的方法来实现这个目标?
答案 0 :(得分:12)
使用TransactionScope类,如下所示:
using (TransactionScope ts = new TransactionScope())
{
//all db code here
// if an error occurs jump out of the using block and it will dispose and rollback
ts.Complete();
}
如有必要,TransactionScope类将自动转换为分布式事务。
答案 1 :(得分:1)
使用transactionScope就是答案。它甚至适用于不同的DBMS !!!
答案 2 :(得分:0)
正如克莱图斯所说,你需要某种two-phase commit。正如文章所述,这在实践中并不总是有效。如果您需要一个强大的解决方案,您必须找到一种方法来序列化事务,以便您可以一个接一个地执行它们并逐个回滚。
由于这取决于你没有提供任何细节的具体情况,我不能给你如何攻击它的想法。
答案 3 :(得分:0)
如果您希望跨多个SQL Server实例执行事务,请查看Microsoft Distributed Transaction Coordinator文档