我需要在 .Net Web 应用程序中执行一系列文件系统和数据库操作,如果发生故障,一切都会回滚。操作是:
- 使用 HttpPostedFile 将多页 tiff 文件上传到服务器
- 将发布文件的记录插入数据库
- 将多页 tiff 中的单个图像处理并保存为服务器上的单个文件
- 将单个图像的记录插入数据库
我可以使用 3.5 框架中的可用类将这些操作包装在单个事务中吗?我应该手动使用 try catch 块和回滚操作吗?
我需要在 .Net Web 应用程序中执行一系列文件系统和数据库操作,如果发生故障,一切都会回滚。操作是:
我可以使用 3.5 框架中的可用类将这些操作包装在单个事务中吗?我应该手动使用 try catch 块和回滚操作吗?
我可以使用 3.5 框架中的可用类将这些操作包装在单个事务中吗?
不,也不使用任何其他技术,因为您的链接薄弱。
1.使用HttpPostedFile上传多页tiff文件到服务器
2.将发布文件的记录插入数据库
3.将多页tiff中的单个图像处理并保存为服务器上的单个文件
4.将单个图像的记录插入数据库
2-4 可以在现代 Windows 上的事务中轻松完成 - NTFS 可以参与事务。
您的问题是 1。1 是不可能的,因为 - 注意 - HTTP 没有事务的概念。如果从您的服务器上传,您可以在上传 CRM(补偿资源管理器)中上传指令,但您需要能够通过 HTTP 删除它们,以防回滚,并且(完美,但可选)上传它们但不在您提交之前可见。这是如果 API 支持它 - 编写起来很简单(.NET 中的 CRM 非常简单),否则你会陷入死胡同或妥协。
如果您要上传到您的服务器然后处理事务,那么从技术上讲,要正确处理多图像上传,您必须决定事务控制的位置。上传必须有适当的 API 来启动事务,使用事务令牌进行上传,然后在所有上传完成后提交(因为只有这样才能开始处理)。这对编程来说是微不足道的——在大多数情况下甚至不使用 TPM,因为您可以在处理中滚动逻辑事务。但如果您愿意,CRM 可以再次处理回滚时的必要更改。
尝试以下操作:
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();
}