日期:2014-05-17  浏览次数:20760 次

真诚请教高手! 跨数据库事务的实现! 冰天雪地,裸体360度空翻,双膝着地,求救!
在1个项目中,此项目有大量的跨2台服务器,对2个SQLSERVER数据库的操作,而且有非常严格的事务要求.

百度了很久,找到了以下两种方法! 

请问:以下2种方法稳妥么?选择哪个好些? 

如果这2种都不好,更优的方法是?

关系项目成败! 高手一定帮忙!

先谢啦! 

------解决方案--------------------
无所谓哪一个“更优”的问题。这就是普通的transaction。这就好像你写
using(var trans1= conn1.BeginReansaction())
using(var trans2= conn2.BeginTransaction())
{
    .....分别处理两个数据库操作
}
一样。

这无所谓“更优”。最好的办法就是在业务上进行安排和设计,不要依赖数据库事务。

比如说有几百个点联网卖票,难道一个点卖票的过程中要理解为“数据库事务”?根本不可能。人家会先把票从“待卖”移动到“正在交易”中包括起来,然后假设没有成功卖出,则过3分钟就会自动放回到“待卖”中再此投入使用。

而不会弄个简单的“数据库事务”这种纸上谈兵的技术。
------解决方案--------------------
你这两个方法其实就是一个方法,只是写代码时变了下花样。

事务是由事务管理器控制的,当在同一个应用程序域中,并且登记到事务中的持久化资源管理器是同样是,会使用LTM(LightWeight Transaction Manager)事务管理器进行管理。

当登记的是NTFS文件系统下的文件资源时,会使用内核事务管理器进行管理。

如果涉及跨应用程序域,网络时,使用分布式事务管理器(DTC)进行管理。

这三种事务管理器是由系统根据自动决定的,事务的提升也是自动的,你这种情况就会自动使用分布式事务管理器进行管理。使用DTC,需要从服务中开启Distributed Transaction Coordinator服务.

但是,之前使用分布式事务感觉不是很好,因为同时依赖两个远程的数据库,你可以另外做一套和事务同样处理方式的机制,分两阶段,先提交(这时不生效),后确认,如果任何一步有问题时则撤销已提交的操作。