如何使通用代码块成为交易

时间:2019-07-12 06:13:02

标签: c#

我有以下代码:

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

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

NB这与多线程等无关。这只是一般代码。

1 个答案:

答案 0 :(得分:2)

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

  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一起更新。

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

图形(帧缓冲区)和音频(音频缓冲区)也存在类似的机制。当然,数据库具有其自己的特定机制,该机制除其他外还支持原子性和并发性。