看代码:

class MyClass {  public static int g=1;}

using (TransactionScope tsTransScope = new TransactionScope())
{
    //Do stuff here
    MyClass.g=999;
    tsTransScope.Complete();
}
  • 查看“在这里做一些事情”部分:我可以在其中写什么类型的对象,以便可以进行事务处理?我已经知道我可以编写ADO命令,并在需要时将它们回滚/提交。但是通过C# POV:类必须具有什么实现才能实现事务处理(实现某些接口(interface)或其他功能?)
  • 如果它是在TransactionScope子句(最终为try +)中调用的using,则逻辑上说如果发生回滚:MyClass.g应该返回BACK,但其值为1。这没有发生。
    所以我想这与第一个问题有关。如何使MyClass可交易?
  • 最佳答案

    您应该实现 System.Transactions.IEnlistmentNotification 接口(interface),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/

    10-09 01:43