gpt4 book ai didi

c# - 为什么——如何——在处理后处理交易?

转载 作者:太空狗 更新时间:2023-10-29 17:41:54 25 4
gpt4 key购买 nike

我正在尝试使用一些环境事务范围(谢谢, ),这是我以前从未真正做过的,而且我看到了一些……奇怪的行为我正在努力理解。

我正在尝试加入当前事务范围并在它成功完成后做一些工作。由于它拥有一些资源,我的入伍参与者实现了 IDisposable。我有一个表现出奇怪行为的简单示例。

对于这门课,

class WtfTransactionScope : IDisposable, IEnlistmentNotification
{
public WtfTransactionScope()
{
if(Transaction.Current == null)
return;
Transaction.Current.EnlistVolatile(this, EnlistmentOptions.None);
}
void IEnlistmentNotification.Commit(Enlistment enlistment)
{
enlistment.Done();
Console.WriteLine("Committed");
}

void IEnlistmentNotification.InDoubt(Enlistment enlistment)
{
enlistment.Done();
Console.WriteLine("InDoubt");
}

void IEnlistmentNotification.Prepare(
PreparingEnlistment preparingEnlistment)
{
Console.WriteLine("Prepare called");
preparingEnlistment.Prepared();
Console.WriteLine("Prepare completed");
}

void IEnlistmentNotification.Rollback(Enlistment enlistment)
{
enlistment.Done();
Console.WriteLine("Rolled back");
}

public void Dispose()
{
Console.WriteLine("Disposed");
}
}

如此处所示使用时

using(var scope = new TransactionScope())
using(new WtfTransactionScope())
{
scope.Complete();
}

控制台输出展示了 wtf-ness:

Disposed
Prepare called
Committed
Prepare completed

呜呜。

我在交易完成前就被处理掉了。这......有点否定了卡在事务范围内的好处。我希望在交易成功(或未成功)完成后通知我,以便我可以做一些工作。 不幸的是我假设这会发生在 scope.Complete() 之后,并且在我们离开 using 范围时我被处置之前。显然情况并非如此。

当然,我可以破解它。但是我还有其他问题,这些问题基本上阻止了我这样做。在这种情况下,我将不得不放弃并做其他事情。

我是不是做错了什么?或者这是预期的行为?可以采取不同的措施来防止这种情况发生吗??

最佳答案

这是自己造成的痛苦。您违反了 IDisposable 的一个非常基本的规则,一个对象只有在其他地方不再使用时才应该被释放。当您的 using 语句调用 Dispose() 时,它正在使用,您在 WtfTransactionScope 构造函数中传递了对对象的引用。在它完成之前您不能处置它,这必然意味着您必须在 TransactionScope 的 using 语句完成并且事务已提交/回滚之后处置它。

我会让你担心让它变得漂亮,但一个明显的方法是:

using(var wtf = new WtfTransactionScope())
using(var scope = new TransactionScope())
{
wtf.Initialize();
scope.Complete();
}

Prepare completed 只是一个无用的调试语句。只需删除它即可。

关于c# - 为什么——如何——在处理后处理交易?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24664066/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com