我该如何处理这类交易?

时间:2012-08-22 04:05:12

标签: c# .net sql sql-server-2008 transactions

我将用户上传的文件保存在磁盘上,只是将文件名存储在数据库中。我想写一个代码,如果插入记录并将文件保存在磁盘上,那么只有它应该提交。如果在DB中创建记录但由于权限问题而无法保存文件等,我希望回滚整个事务。显然,使用SqlTransaction

无法做到这一点

我应该如何确保datda的这种完整性?

2 个答案:

答案 0 :(得分:1)

Windows Vista及更高版本支持Transactional NTFS,它允许您根据需要在事务中登记文件系统操作。遗憾的是,.NET Framework不直接支持此功能,因此您必须直接通过P / Invoke调用非托管API,或者使用第三方托管包,如Transactional NTFS(TxF).NET:

http://txfnet.codeplex.com/

我自己没有用过这个,但经过一些搜索后,这个看起来最有用。

答案 1 :(得分:1)

对于需要管理的非事务性任务(或者,在您的情况下,某些事务很难包含在事务中),我通常会执行以下操作之一:

1)最后执行非事务性任务。如果它失败了,那么因为事务被回滚就没有什么可担心的,例如:     - 未发送电子邮件     - 文件未保存

2)使用一些执行“两阶段提交”类型的进程/传奇。可能是表中事务之外的条目,表示必须验证文件保存任务。然后尝试事务中的“实际”位(保存记录,保存文件)。然后,另一个预定/临时服务可以检查任务是否已完成,如果没有,则进行清理。

3)沿着(2)的方向:首先将数据存储在临时状态(或多或少与预写日志的工作方式相同)。如果状态正常,您知道数据全部存在,您可以继续并将记录标记为已完成或将其移至永久性住所。另一个预定/临时任务可以清除任何临时数据(如果已过期)。