transactioncope范围内的每个事务都为提交投票。 TS一切都没有。
我想用transactionscope包装几个方法。
using(var ts = new TransactionScope())
{
DoSomething1();
DoSomething2();
ts.Complete();
}
两种方法都打开连接并尝试提交。在死锁超时的情况下,他们会多次尝试重建与事务的连接。因此,我需要将失败的交易排除在投票之外并留下成功的交易。
答案 0 :(得分:2)
将重试逻辑放在TransactionScope
之外。执行后不能排除操作。在执行操作之前,您必须决定事务成员资格。
您当然可以使用TransactionScopeOption.RequiresNew
启动独立交易,但它们将独立于外部TransactionScope
,这会使外部TransactionScope
无用。
此外,无法避免死锁导致死亡。原则上需要从死锁图中删除锁。处理死锁的正确方法是重试整个事务,仅仅是其中的一部分,甚至是单个语句。这将导致不完整的效果。
答案 1 :(得分:1)
交易被视为“全有或全无”,并且它们必须符合ACID。如果你想允许失败的事务,那么它不再是事务操作,它是业务逻辑的一部分,应该为此重写。
中的提及来处理交易抑制:创建范围时,将禁止环境事务上下文。范围内的所有操作都是在没有环境事务上下文的情况下完成的。
连接和上下文生命周期
必须重写多个处理多个逻辑的方法,这些方法涉及打开到同一个数据库的多个连接,只需一个连接和一个上下文就可以调用整个逻辑。如果在事务中调用每个方法,那么为什么要在每个方法中创建事务?