【问题标题】:ASP.Net database and IO operations in one transaction一个事务中的 ASP.Net 数据库和 IO 操作
【发布时间】:2012-07-06 03:23:59
【问题描述】:

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

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

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

【问题讨论】:

标签: c# asp.net database transactions


【解决方案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 可以再次处理回滚时的必要更改。

【讨论】:

  • 你是对的。我最初的问题应该更清楚。我只是在上传文件(步骤 1)完成后尝试将步骤 2 到 4 包装在事务中。但是,当我将步骤 2 到 4 的操作包装在 TransactionScope 中时,我仍然收到错误消息:事务管理器已禁用其对远程/网络事务的支持。
  • 好吧,那就去阅读文档并正确配置 DTC。这是一个与您在这里提出的问题完全不同的问题。默认情况下,网络禁用它(例如,如果 SQL Server 是远程的,则可能需要),但这是标准配置更改。随意打开一个问题 - 它属于哪里,在 Serverfault.com 上(因为这是一个配置问题,而不是编程问题)。
【解决方案2】:

尝试以下方法:

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();
}

【讨论】:

  • 回滚保存的文件怎么样?你会删除它们还是什么?
  • 是的,他必须单独解决这个问题……你可以在事务中设置一个 try-catch 并在任何数据库操作失败时删除它们。
  • 我确实看过 TransactionScope,但我对基于 this 帖子的 IO 操作感到担忧
  • 我会保持简单并创建一些测试来证明在数据库操作之一失败的情况下文件被删除。
猜你喜欢
  • 2013-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-24
相关资源
最近更新 更多