首页 > 解决方案 > 如何使一个通用代码块成为一个事务

问题描述

我有以下代码:

aClass.DoAJob();
bClass.DoAnotherJob();
cClass.DoAThirdJob();

我希望它表现得像一个数据库事务,即。要么全部执行,要么不执行。有什么建议么?

注意这与多线程等无关。这只是通用代码。

标签: c#

解决方案


进行“交易”的一般方法是这样的:

  1. 保留旧数据
  2. 将新数据写入临时区域
  3. 执行原子操作以用新数据替换旧数据,例如通过更新指针。

对于内存中的操作,这可以通过使用对象引用指向状态来轻松实现:

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

这个例子允许程序移动一个对象,同时保证xy一起更新。

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

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


推荐阅读