1

我需要在 .Net Web 应用程序中执行一系列文件系统和数据库操作,如果发生故障,一切都会回滚。操作是:

  1. 使用 HttpPostedFile 将多页 tiff 文件上传到服务器
  2. 将发布文件的记录插入数据库
  3. 将多页 tiff 中的单个图像处理并保存为服务器上的单个文件
  4. 将单个图像的记录插入数据库

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

4

2 回答 2

1

我可以使用 3.5 框架中的可用类将这些操作包装在单个事务中吗?

不,也不使用任何其他技术,因为您的链接薄弱。

1.使用HttpPostedFile上传多页tiff文件到服务器

2.将发布文件的记录插入数据库

3.将多页tiff中的单个图像处理并保存为服务器上的单个文件

4.将单个图像的记录插入数据库

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

您的问题是 1。1 是不可能的,因为 - 注意 - HTTP 没有事务的概念。如果从您的服务器上传,您可以在上传 CRM(补偿资源管理器)中上传指令,但您需要能够通过 HTTP 删除它们,以防回滚,并且(完美,但可选)上传它们但不在您提交之前可见。这是如果 API 支持它 - 编写起来很简单(.NET 中的 CRM 非常简单),否则你会陷入死胡同或妥协。

如果您要上传到您的服务器然后处理事务,那么从技术上讲,要正确处理多图像上传,您必须决定事务控制的位置。上传必须有适当的 API 来启动事务,使用事务令牌进行上传,然后在所有上传完成后提交(因为只有这样才能开始处理)。这对编程来说是微不足道的——在大多数情况下甚至不使用 TPM,因为您可以在处理中滚动逻辑事务。但如果您愿意,CRM 可以再次处理回滚时的必要更改。

于 2012-07-06T04:27:08.510 回答
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();
}
于 2012-07-06T03:33:41.827 回答