2014-02-19 66 views
3

transactionscope范围内的每个事务都为投票投票。和TS一样,所有的矿石都没有。是否有可能在交易范围内的投票中排除交易?

我想用transactionscope包装几个方法。

using(var ts = new TransactionScope()) 
{ 
    DoSomething1(); 
    DoSomething2(); 

    ts.Complete(); 
} 

这两种方法都打开连接并尝试提交。在死锁超时的情况下,他们会尝试多次重新创建与事务的连接。因此,我需要排除失败的投票并保留成功。

+0

我会看到downvoter对这个问题不喜欢的评论。 –

回答

2

将重试逻辑放在TransactionScope之外。执行完毕后,您无法排除操作。您必须在执行操作之前决定事务成员资格。

您当然可以使用TransactionScopeOption.RequiresNew开始独立交易,但它们将独立于外部TransactionScope,这使外部TransactionScope无用。

此外,无法避免杀死事务造成死锁。原则上要求从锁死图中删除锁。处理死锁的正确方法是重试整个事务,仅处理其中的一部分或甚至单个语句。那会导致不完整的效果。

1

交易被定义为“全部或全部”,它们必须符合ACID标准。如果您想允许失败的事务,那么它不再是事务操作,它是业务逻辑的一部分,因此应该重写它。

TransactionScopeOption

禁止提到你可以禁止事务:创建所述范围时,环境事务上下文被抑制。范围内的所有操作都没有环境事务上下文。

连接和背景信息生命周期

调用该处理涉及到打开同一数据库的多个连接的多个逻辑多种方法必须重写以调用整个逻辑只用一个连接和一个上下文。如果每个方法都会在一个事务中被调用,那你为什么要在每个方法中创建事务呢?

+0

SQL Server支持部分回滚(http://technet.microsoft.com/en-us/library/ms178157(v=sql.105).aspx)我看不出为什么这不能存在的事务范围 –

+0

这里是有点解释为什么http://stackoverflow.com/questions/5412635/alternative-to-save-point-when-using-system-transactions –