事务范围以错误的顺序回滚
本文关键字:顺序 错误 范围 事务 | 更新日期: 2023-09-27 18:31:50
我在应用程序中使用 TransactionScope
类,因为我需要自然地执行一些操作(要么全部成功,要么没有)。
由于此操作不仅与数据库相关,因此我通过实现 IEnlistmentNotification
接口为磁盘和系统服务操作(例如事务文件移动和服务停止)定义了自己的事务行为。毫无疑问,它工作正常,但是当我将所有这些东西放在一个应用程序中时,我得到了意想不到的结果。
想象一下以下情况
using(var ts = ...)
{
TxServiceManager.StopServices(services);
TxFileManager.MoveFiles(files);
DbManager.RunChangeScripts(scripts);
TxServiceManager.StartServices(services);
ts.Complete();
}
工作得很好,直到我遇到需要回滚所有操作的情况。它在启动服务时发生,我想,事务范围将
- 停止它设法启动的服务
- 回滚数据库
- 还原文件
- 启动服务
但是呢?它从代码清单中的第一个操作开始,即服务停止,当然通过启动服务来回滚。好的,服务正在运行,然后在第二个操作中失败,因为我无法覆盖这些服务在运行时使用的文件。
回滚是如何从第一个操作而不是最后一个操作开始的?
因为简单地(来自 MSDN):
您应该知道,通知可能不会按顺序或按特定顺序发送。
顺序未定义。