我有一个 ASP.NET Core 6.0 应用程序,它使用 SQL Server 进行数据库操作,并使用 Dapper 作为 ORM。在我的应用程序中,我实现了文件上传功能,其端点名为
UploadFile
,它会触发 UploadService.UploadFile
方法。
此方法有一个顶级可序列化
TransactionScope
,它调用几个也有自己的可序列化事务范围的内部方法。这些内部方法也可能从应用程序的其他部分调用,有时可以独立运行。这些方法中的每一个都会打开自己的 SQL 连接。
当单个用户上传文件时,一切都会按预期进行。但是,当多个用户尝试同时上传文件时,就会出现问题。具体来说,我遇到了“分布式事务”异常。
为了解决这个问题,我考虑为每个 HTTP 请求打开一个事务,但随后遇到了另一个问题:如果不启用 MARS(多个活动结果集),我无法读取多个结果集。经过研究,我发现了使用 MARS 的几个问题:
考虑到这些因素:
为什么应用程序在单个用户上传文件时不会遇到“分布式事务”异常?毕竟多个连接仍在单个
TransactionScope
内打开。
有没有一种方法可以管理并发上传,同时避免需要 MARS 并确保数据完整性?
是否有其他方法可以让我以安全的方式顺序处理上传?
当多个用户尝试同时上传文件时。具体来说,我遇到了“分布式事务”异常。
那么你就做错了。如果您在各处使用相同的连接字符串,并在调用使用 SqlConnection 的任何其他方法之前关闭每个 SqlConnection,则 Http 请求的所有数据访问都应重用单个 SqlConnection 和事务。