2012-07-06 49 views
1

我需要在.Net Web应用程序中执行一系列文件系统和数据库操作,如果发生故障,所有事件都会回滚。这些操作是:使用HttpPostedFile 发布文件的一个事务中的ASP.Net数据库和IO操作

  • 插入记录到数据库
  • 工艺和保存多页TIFF作为服务器
  • 的插入记录单个文件的单个图像

    1. 上传多页TIFF文件到服务器个人图像到数据库

    我可以使用3.5框架中的可用类将这些操作包装在单个事务中吗?我应该手动使用try catch块和回滚操作吗?

  • +0

    使用TransactionScope时,会发生以下错误: 事务管理器已禁用其对远程/网络事务的支持。 此错误在[http://stackoverflow.com/questions/10130767/the-transaction-manager-has-disabled-its-support-for-remote-network-transactions](http://stackoverflow.com/questions-10130767/the-transaction-manager-has-disabled-its-support-for-remote-network-transactions) – kyletme 2012-07-06 04:09:46

    回答

    1

    Can I wrap these operations in a single transaction using the available classes in the 3.5 framework?

    不,不是因为你有一个薄弱环节,任何其他技术。使用HttpPostedFile

    发布文件的

    2.插入记录到数据库

    3.Process并保存在服务器上

    在多页TIFF作为单独的文件单独的图像

    1.Upload多页TIFF文件到服务器4.插入单个图像到数据库的记录

    2-4可以在现代Windows上的事务中轻松完成 - NTFS可以参与事务。

    你的问题是1. 1是不可能的,因为 - 注意 - HTTP没有交易的概念。如果上传发生在你的服务器上,你可能会在Upload CRM(补偿资源管理器)中上传插件,但是你需要能够通过HTTP Too删除它们,以便在回滚的情况下(完全但可选)可见直到你提交。这就是如果API支持IT - 写作(.NET中的CRM非常容易),否则你会死在那里或采取妥协。

    如果您上传到您的服务器,然后在一个交易中处理,技术上处理多个图片上传正确,你必须决定transaciotnal控件的位置。上传必须有适当的API来启动一个事务,使用事务标记进行上传,然后在所有上传完成时提交(只有在可以开始处理时)。这对程序来说是微不足道的,甚至在大多数情况下都不使用TPM,因为您可以在处理中滚动逻辑事务。但是如果你愿意,再一次CRM可以处理在回滚情况下的必要变化。

    +0

    你是对的。我最初的问题应该更清楚。一旦上传的文件(步骤1)完成,我只是试图在事务中将第2步到第4步打包。但是,当我在TransactionScope中将第2步到第4步的操作打包时,我仍然收到错误:事务管理器已禁用其对远程/网络事务的支持。 – kyletme 2012-07-06 04:42:38

    +1

    好吧,然后去阅读文档并正确配置DTC。这是一个完全不同的问题,而不是你在这里问的问题。默认情况下,它对网络是禁用的(例如,如果SQL Server是远程的,则可能需要),但这是标准配置更改。随意在Serverfault.com上打开一个关于它的地方的问题(因为这是一个配置问题,而不是编程问题)。 – TomTom 2012-07-06 06:25:28

    0

    尝试类似如下:

    using (TransactionScope scope = new TransactionScope()) 
    { 
        using (SqlConnection connection = new SqlConnection(connectionString)) 
        { 
         try 
         { 
          // Do all work here... 
         } 
         catch (Exception ex) 
         { 
          // Delete files 
          // LogError(ex); 
         }     
        } 
        scope.Complete(); 
    } 
    
    +0

    回滚保存的文件如何?你会删除它们还是什么? – codingbiz 2012-07-06 03:35:35

    +2

    是的,他必须单独处理这个问题......如果任何数据库操作失败,您可以在事务中进行尝试并将其删除。 – IrishChieftain 2012-07-06 03:37:16

    +0

    感谢您的反馈 – codingbiz 2012-07-06 03:39:35