c#中的可事务对象

本文关键字:事务 对象 | 更新日期: 2023-09-27 17:50:21

查看代码:

class MyClass {  public static int g=1;}
using (TransactionScope tsTransScope = new TransactionScope())
{
    //Do stuff here
    MyClass.g=999;
    tsTransScope.Complete();
}
  • 查看"Do stuff here"部分:我可以在那里写什么类型的对象,以便它们可以可处理 ?我已经知道我可以编写ADO命令,它们将在必要时回滚/提交。但是通过C# POV:一个类应该有什么实现才能是可处理的(实现一些接口或其他东西?)

  • 如果它是一个TransactionScope,因为它调用,在using子句(这是try + finally),逻辑上说,如果有一个回滚:MyClass.g应该得到它的值1。然而。这是不可能的。我想这和第一个问题有关。如何使MyClass 可交易

c#中的可事务对象

您应该实现System.Transactions.IEnlistmentNotification接口,这篇文章可能会对您有所帮助

对于现成的事务性内存存储,有(软件事务性内存)和STM。. NET不是最终的东西,但微软正在努力!

一个小例子:

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: add G KEEPER FOR ROYI:) *

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();
}