c# - 如何使一个通用代码块成为一个事务
问题描述
我有以下代码:
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
一起更新。
对于非内存操作,此模式的实现是特定于介质的。例如,对于文件操作,程序可能会写入临时文件。完成所有操作后,程序会将文件重命名为用户期望的路径。这可能就是您的浏览器下载功能的工作方式。
图形(帧缓冲区)和音频(音频缓冲区)也存在类似的机制。当然,数据库有它们自己的特殊机制来支持原子性和并发性等。
推荐阅读
- hibernate - 如何使用 JPA 查询多对多元素
- spring - 使用 @Autowired 属性标记注入构造函数的目的是什么?
- python - 使用 Matplotlib 调整图形
- sass - @if condition in SASS returns false when comparing to string
- r - 在 RStudio 中转义 readLines() 函数
- database - 可以使用哪些绩效策略来处理新旧会计余额?
- ios - 可扩展单元格不会扩展
- arrays - 优化 Swift 函数以在更大的整数数组中找到一组特定的 3 位数字组合
- json - 使用 Pyspark 从数组中读取 JSON 项?
- django - 如何使用 panda 将 prefetch_related 查询转换为数据框