2012-08-22 34 views
1

我將用戶上傳的文件保存在磁盤上,並將文件名保存在數據庫中。我想編寫一個代碼,如果插入了記錄並且文件保存在磁盤上,那麼只有它應該提交。如果記錄是在數據庫中創建的,但由於權限問題等原因無法保存文件,我希望整個事務回滾。顯然這不能使用SqlTransaction我應該如何處理這些類型的交易?

我應該如何確保datda的這種完整性?

+2

你有沒有看過使用FILESTREAM? http://technet.microsoft.com/en-us/library/bb933993(v=sql.105).aspx請參閱http://msdn.microsoft.com/en-us/library/cc716724.aspx –

回答

1

我通常做的是需要一些管理非事務性任務以下(或者,在你的情況,東西是很難包括在一個事務)中的一個:

1)執行非事務性任務持續。如果失敗那麼就應該有什麼可擔心的,因爲事務回滾,如: - 電子郵件未發送 - 文件沒有保存

2)使用一些進程/佐賀執行一種類型的兩種」階段提交「。也許表中的事務之外的條目表明您的文件保存任務必須經過驗證。然後在你的交易中嘗試你的「實際」位(保存記錄,保存文件)。然後另一個計劃/臨時服務可以檢查任務是否完成,如果沒有,則清理。 3)沿着(2)的路線:首先將數據存儲在臨時狀態(或多或少地是預先寫入日誌工作的方式)。如果狀態正常,則您知道數據全部存在,您可以繼續並將您的記錄標記爲已完成或將其移至永久主頁。另一個計劃/臨時任務可以清除任何臨時數據(如果已過期)。

+0

我很喜歡第一點。這不是100%的錯誤,但它解決了大部分問題。 – Jack

1

Windows Vista及以上版本支持Transactional NTFS,它允許您根據需要在事務中使用文件系統操作。不幸的是,.NET Framework不直接支持此功能,所以你必須要麼調用非託管的API通過P直接/調用或利用第三方託管包裝庫就像事務性NTFS(TxF的).NET:

http://txfnet.codeplex.com/

我沒有用過這個,但是在做了一些搜索之後,這個看起來是最可用的。