Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使一个通用代码块成为事务_C# - Fatal编程技术网

C# 如何使一个通用代码块成为事务

C# 如何使一个通用代码块成为事务,c#,C#,我有以下代码: aClass.DoAJob(); bClass.DoAnotherJob(); cClass.DoAThirdJob(); 我希望它的行为像一个数据库事务,即要么全部执行,要么不执行。有什么建议吗 注意,这与多线程等无关。这只是一般代码。进行“交易”的一般方法如下: 将旧数据保留在适当的位置 将新数据写入临时区域 执行原子操作以用新数据替换旧数据,例如通过更新指针 对于内存中的操作,这可以通过使用对象引用指向状态来实现: class Program { static

我有以下代码:

aClass.DoAJob();
bClass.DoAnotherJob();
cClass.DoAThirdJob();
我希望它的行为像一个数据库事务,即要么全部执行,要么不执行。有什么建议吗


注意,这与多线程等无关。这只是一般代码。

进行“交易”的一般方法如下:

  • 将旧数据保留在适当的位置
  • 将新数据写入临时区域
  • 执行原子操作以用新数据替换旧数据,例如通过更新指针
  • 对于内存中的操作,这可以通过使用对象引用指向状态来实现:

    class Program
    {
    
        static Point _position; //Points to latest position of something
    
        static void Move(int x, int y)
        {
            var temp = new Point(x, y);
            _position = temp;
        }
    }
    
    此示例允许程序移动对象,同时确保同时更新
    x
    y

    对于非内存操作,此模式的实现特定于介质。例如,对于文件操作,程序可能会写入临时文件。所有操作完成后,程序会将文件重命名为用户期望的路径。这可能就是浏览器的下载功能的工作原理


    图形(帧缓冲区)和音频(音频缓冲区)也存在类似的机制。当然,数据库有自己的特殊机制,支持原子性和并发性等。

    生成“事务”的一般方法如下:

  • 将旧数据保留在适当的位置
  • 将新数据写入临时区域
  • 执行原子操作以用新数据替换旧数据,例如通过更新指针
  • 对于内存中的操作,这可以通过使用对象引用指向状态来实现:

    class Program
    {
    
        static Point _position; //Points to latest position of something
    
        static void Move(int x, int y)
        {
            var temp = new Point(x, y);
            _position = temp;
        }
    }
    
    此示例允许程序移动对象,同时确保同时更新
    x
    y

    对于非内存操作,此模式的实现特定于介质。例如,对于文件操作,程序可能会写入临时文件。所有操作完成后,程序会将文件重命名为用户期望的路径。这可能就是浏览器的下载功能的工作原理


    图形(帧缓冲区)和音频(音频缓冲区)也存在类似的机制。当然,数据库也有自己独特的机制,支持原子性和并发性等。

    你能澄清一下你的问题吗?例如,每个方法都做些什么?可能希望操作是原子的,如果需要,则回滚fails@arynaq是的,我明白。谢谢。假设DoAJob做了一个Console.WriteLine,然后DoAThirdJob失败了。你打算怎么取消那个铃声?用户可能已经阅读了控制台。了解数据库如何实现原子性可能对您有所帮助。你了解两阶段提交是如何工作的吗?你能澄清你的问题吗?例如,每个方法都做些什么?可能希望操作是原子的,如果需要,则回滚fails@arynaq是的,我明白。谢谢。假设DoAJob做了一个Console.WriteLine,然后DoAThirdJob失败了。你打算怎么取消那个铃声?用户可能已经阅读了控制台。了解数据库如何实现原子性可能对您有所帮助。您了解两阶段提交是如何工作的吗?