gpt4 book ai didi

c# - C# 中的可事务对象?

转载 作者:太空狗 更新时间:2023-10-29 22:52:42 24 4
gpt4 key购买 nike

查看代码:

class MyClass {  public static int g=1;}

using (TransactionScope tsTransScope = new TransactionScope())
{
//Do stuff here
MyClass.g=999;
tsTransScope.Complete();
}
  • 查看“在这里做事”部分:我可以在其中写入哪些类型对象,以便它们可以可交易 ?我已经知道我可以编写 ADO 命令,它们将在必要时回滚/提交。但是通过 C# POV:类必须具有什么实现才能Transactionable(实现某些接口(interface)或其他东西?)

  • 如果它是它调用的 TransactionScope,在 using 子句(即 try + finally)中,逻辑表明如果有回滚: MyClass.g 应该取回其值 1。但是。这没有发生。所以我想这与第一个问题有关。我怎样才能使 MyClass Transactionable

最佳答案

你应该实现 System.Transactions.IEnlistmentNotification界面,this文章和this可能对你有帮助

对于现成的事务性内存存储,有 ( Software transactional memory ) 和 STM.NET这不是最终的东西,但 Microsoft 正在努力!

一个小例子:

using System.IO;
using System.Text;
using System.Transactions;

namespace Sakher.Transactions
{
public class TsansactionalFileWriter
{
private FileTransactionEnlistment fileTransactionEnlistment = new FileTransactionEnlistment();
public TsansactionalFileWriter(string filePath)
{
fileTransactionEnlistment.FilePath = filePath;
Transaction.Current.EnlistVolatile(fileTransactionEnlistment, EnlistmentOptions.None);
}

public void AppendText(string text)
{
fileTransactionEnlistment.Content.Append(text);
}

public void WriteAllText(string text)
{
fileTransactionEnlistment.Content = new StringBuilder(text);
}
}

public class FileTransactionEnlistment : IEnlistmentNotification
{
public string FilePath { get; set; }
public StringBuilder Content { get; set; }

public FileTransactionEnlistment()
{
Content = new StringBuilder();
}

public void Commit(Enlistment enlistment)
{
File.WriteAllText(FilePath, Content.ToString());
}

public void InDoubt(Enlistment enlistment)
{

}

public void Prepare(PreparingEnlistment preparingEnlistment)
{
//You can create the file here
preparingEnlistment.Prepared();
}

public void Rollback(Enlistment enlistment)
{
//Do ssomething when the transaction is rolled-back (You may delete the file if you have created it!)
}
}

}

使用代码:

        using (TransactionScope tr = new TransactionScope())
{
TsansactionalFileWriter writer = new TsansactionalFileWriter("c:\\myFile.txt");
writer.AppendText("sdfgssdfgsdf");
tr.Complete();
}

* EDTI:为 ROYI 添加了 G KEEPER :) *

using System.Transactions;

namespace Sakher.Transactions
{
public class Royi_s_gReturnerClass
{
private GReturnerEnlistment fileTransactionEnlistment = new GReturnerEnlistment();
public Royi_s_gReturnerClass()
{
Transaction.Current.EnlistVolatile(fileTransactionEnlistment, EnlistmentOptions.None);
}
}

public class GReturnerEnlistment : IEnlistmentNotification
{
public int GOldValue { get; set; }

public GReturnerEnlistment()
{
GOldValue = MyClass.g;
}

public void Commit(Enlistment enlistment)
{

}

public void InDoubt(Enlistment enlistment)
{

}

public void Prepare(PreparingEnlistment preparingEnlistment)
{
preparingEnlistment.Prepared();
}

public void Rollback(Enlistment enlistment)
{
MyClass.g = GOldValue;
}
}

}

您的代码将是:

class MyClass {  public static int g=1;}

using (TransactionScope tsTransScope = new TransactionScope())
{
Royi_s_gReturnerClass returner = new Royi_s_gReturnerClass();
//Do stuff here
MyClass.g=999;
tsTransScope.Complete();
}

关于c# - C# 中的可事务对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14089592/

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