如何将两个交易绑定在一起?
问题描述:
我在一个场景中,我有两个不同的数据库,我想在这两个数据库中提交不同的更改,如果其中一个提交失败,另一个也会失败。如何将两个交易绑定在一起?
如果我在'数据库A'上的'事务A'和'数据库B'上的'事务B',我怎样才能将两个事务绑定在一起,这样两者都会原子地成功或失败。
我想不出有办法做到这一点。如果'交易A'失败很容易回滚'交易B',但如果'交易B'失败时'交易A'已经提交,我搞砸了。
我想知道是否有一种技术在特定的数据库产品中处理此问题,或者如果存在通用模式来处理这种情况,甚至可以应用于任何事务性系统(如绑定数据库)与事务消息队列交易。
答
有一个称为“两阶段提交”的标准数据库过程,大多数商业RDBMS都以某种方式成功实现了2PC。
以下是一些参考文献;
SQL服务器:http://msdn.microsoft.com/en-us/library/aa754091(v=bts.10).aspx 甲骨文:http://download.oracle.com/docs/cd/E14072_01/server.112/e10595/ds_txns003.htm MySQL的:http://dev.mysql.com/doc/refman/5.0/en/xa.html
答
using (TransactionScope scopeExternal = new TransactionScope())
{
using (TransactionScope scope1
= new TransactionScope(TransactionScopeOption.Suppress))
{
... operations for 1st DB
scope1.Complete();
}
using (TransactionScope scope2
= new TransactionScope(TransactionScopeOption.Suppress))
{
... operations for 2nd DB
scope2.Complete();
}
scopeExternal.Complete();
}
如果无论从scope1
或scope2
任何交易失败,它抛出,从scopeExternal
交易防止提交一个例外。