我处在一个场景中,我有两个不同的数据库,我想在这两个数据库中提交不同的更改,如果其中一个提交失败,另一个也会失败。
如果我在“数据库A”上有“事务A”,“数据库B”上有“事务B”,我如何将这两个事务绑定在一起,以便原则上成功或失败。
我无法想办法做到这一点。如果“交易A”失败,很容易回滚“交易B”,但如果“交易A”已经提交时“交易B”失败,我就搞砸了。
我想知道是否有一种技术可以在特定的数据库产品中处理这种情况,如果有一种通用模式来处理这种情况甚至可以应用于任何事务系统,例如绑定数据库事务,那就更好了使用事务性消息队列。
答案 0 :(得分:2)
您需要使用分布式事务管理器(在最简单的情况下,您可以将程序本身充当)。
X/OpenXA
是管理分布式事务的最广泛使用的标准,四大的所有数据库都支持它。
答案 1 :(得分:1)
有一个称为“两阶段提交”的标准数据库进程,大多数商业RDBMS都以这种或那种方式成功实现了2PC。
以下是一些参考资料;
SQL Server: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
答案 2 :(得分:0)
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
事务提交的异常。