我将用户上传的文件保存在磁盘上,只是将文件名存储在数据库中。我想编写一个代码,如果插入记录并且文件保存在磁盘上,那么只有它应该提交。如果在数据库中创建了记录,但由于权限问题等原因无法保存文件,我希望回滚整个事务。显然这不能使用SqlTransaction
我应该如何确保这种类型的 datda 完整性?
我将用户上传的文件保存在磁盘上,只是将文件名存储在数据库中。我想编写一个代码,如果插入记录并且文件保存在磁盘上,那么只有它应该提交。如果在数据库中创建了记录,但由于权限问题等原因无法保存文件,我希望回滚整个事务。显然这不能使用SqlTransaction
我应该如何确保这种类型的 datda 完整性?
Windows Vista 及更高版本支持事务 NTFS,它允许您根据需要在事务中登记文件系统操作。不幸的是,.NET Framework 不直接支持此功能,因此您必须通过 P/Invoke 直接调用非托管 API 或使用第三方托管包装库,如 Transactional NTFS (TxF) .NET:
我自己没有使用过这个,但是在做了一些搜索之后,这个看起来是最有用的。
对于需要一些管理的非事务性任务(或者,在您的情况下,一些难以包含在事务中的任务),我通常会执行以下操作之一:
1) 最后执行非事务性任务。如果失败,则无需担心,因为事务已回滚,例如: - 未发送电子邮件 - 未保存文件
2)使用一些执行“两阶段提交”类型的进程/传奇。可能是表中事务之外的条目,表明您的文件保存任务必须经过验证。然后在您的交易中尝试您的“实际”位(保存记录,保存文件)。然后另一个计划/临时服务可以检查任务是否完成,如果没有完成则清理。
3)按照(2)的思路:首先将数据存储在临时状态(或多或少的预写日志的工作方式)。如果状态正常,您就知道数据就在那里,您可以继续并将您的记录标记为已完成或将其移至其永久位置。另一个计划/临时任务可以清理任何已过期的临时数据。