关于分布式事务疑问!求高手解疑!!
问题一、我要同时操作2个以上数据库中的表,要求用事务保证它的完整性。这时我有两种选择,一是用分布式事务。二事我针对每一个库建立一个SqlTransaction的事务去操作,然后在所有操作都成功的前提下把每个一库的SqlTransaction一起进行提交。
因为我看了网上很多文章说.net分布式事务性能效率方面不够可靠,所以不知道那一种方法更为可行!!效率更高!
问题二、
TransactionOptions to = new TransactionOptions();
to.IsolationLevel = System.Transactions.IsolationLevel.RepeatableRead;
to.Timeout = TimeSpan.FromMinutes(2.00);
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required, to, EnterpriseServicesInteropOption.Full))
{
......(事务SQL操作内容)
ts.Complete();
}
这是我现在项目用的分布式事务的写法。在using{}里面所有sql操作都会在事务范围以内,但我现在有一个需求是我把所有事务写好后必须在一个非事务的sql操作请求执行成功后此事务才能进行提交,如果失败则进行回滚。而我把这个SQL操作放在using里他又会在此事务的范围之内,如果我把它放在using结束后面我又不能根据返回值来对事务的提交和回滚进行操作!
求高手解决一下!!谢谢!!! --------------------编程问答-------------------- 传说中的高手呢????!!!!!出来帮帮忙呀。。。 --------------------编程问答-------------------- !!!!!!!!!!!!!!!!!!!!!!!!!!!!! --------------------编程问答-------------------- 问题一:你的多个数据库要保持各自完整还是怎么样?
各自完整的话针对每个数据库开一个事务就好了喽。
否则的话要分布式事务的。
你这个怎么实现??
try
{
//transaction1...
trans1.commit();
trans2.commit();
} catch(......)......
commit语句都写在try里面的吧,你怎么知道都成功 --------------------编程问答-------------------- 来个权威点的回答吧!!!高手呀!! --------------------编程问答-------------------- 请楼主先分析一下你为什么要用分布式事务....既然你用了分布式事务,又为什么硬给它添加一个非事务的操作进去????
还有如果最后一个非事务sql操作跟之前事务没有键值的关联,是否可以考虑先执行非事务sql操作,再进行事务操作...
--------------------编程问答-------------------- 5楼:
我现在有个业务逻辑是这样。在一个商品购买的逻辑中。
我得先减掉供货商的库存,然后写入相关的购物单据资金交易记录等操作。
最后我要扣除购买方的帐户余额及加上销售方的金额。
现在的问题是最后的扣款是一个接口类型的操作,就有点像我通过一个接口去请求像淘宝这样的第三方做帐户资金的相关操作。当后回成功则提交前面的事务操作,如果失败则回滚。
因为我们现在开发的一个系统包含商家的产品库存等信息,资金相关操作是另一个第三方已经成形的系统,所以资金必须要通过接口去操作。
而我也不能先去做资金操作的接口,这样如果资金操作成功,而我后面的库存等情况操作失败那资金是没有办法回滚的 --------------------编程问答-------------------- 如果最后一个非事务sql操作跟之前事务没有键值的关联,是否可以考虑先执行非事务sql操作,再进行事务操作...
--------------------编程问答--------------------
//这里定义一个返回值
int returnValue=0;
TransactionOptions to = new TransactionOptions();
to.IsolationLevel = System.Transactions.IsolationLevel.RepeatableRead;
to.Timeout = TimeSpan.FromMinutes(2.00);
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required, to, EnterpriseServicesInteropOption.Full))
try
{
using (SqlConnection connection1 = new SqlConnection(connectString1))
{
try
{
//这里是操作供货商的库存的代码块
returnValue=操作供货商的库存的返回值;
using (SqlConnection connection2 = new SqlConnection(connectString2))
try
{
//这里写入相关的购物单据资金交易记录操作
returnValue = 操作返回值;
}
catch (Exception ex)
{
//失败,异常
}
}
catch (Exception ex)
{
//失败,异常
}
}
ts.Complete();
}
if (returnValue > 0)
{
//这里假如你有执行扣款的方法是Money();成功返回1,失败返回0;
if(Money()>1)
{
事务进行提交
}
else
{
事务进行rolled back
}
}
else
{
事务进行rolled back
}
你试一下这种方式,主要我不清楚你的业务 --------------------编程问答-------------------- 关注+学习!!!
帮你顶!!!
补充:.NET技术 , ASP.NET