使用 Dapper、SQL Server 和事务范围处理 ASP.NET Core 6.0 中的并发请求

问题描述 投票:0回答:1

我有一个 ASP.NET Core 6.0 应用程序,它使用 SQL Server 进行数据库操作,并使用 Dapper 作为 ORM。在我的应用程序中,我实现了文件上传功能,其端点名为

UploadFile
,它会触发
UploadService.UploadFile
方法。

此方法有一个顶级可序列化

TransactionScope
,它调用几个也有自己的可序列化事务范围的内部方法。这些内部方法也可能从应用程序的其他部分调用,有时可以独立运行。这些方法中的每一个都会打开自己的 SQL 连接。

当单个用户上传文件时,一切都会按预期进行。但是,当多个用户尝试同时上传文件时,就会出现问题。具体来说,我遇到了“分布式事务”异常。

为了解决这个问题,我考虑为每个 HTTP 请求打开一个事务,但随后遇到了另一个问题:如果不启用 MARS(多个活动结果集),我无法读取多个结果集。经过研究,我发现了使用 MARS 的几个问题:

  • 并发问题导致过时或未提交的数据读取。
  • 由于独立的命令而导致复杂的错误处理。
  • 潜在的交易不一致。
  • 增加了调试的复杂性。

考虑到这些因素:

  1. 为什么应用程序在单个用户上传文件时不会遇到“分布式事务”异常?毕竟多个连接仍在单个

    TransactionScope
    内打开。

  2. 有没有一种方法可以管理并发上传,同时避免需要 MARS 并确保数据完整性?

  3. 是否有其他方法可以让我以安全的方式顺序处理上传?

c# sql-server concurrency transactions dapper
1个回答
0
投票

当多个用户尝试同时上传文件时。具体来说,我遇到了“分布式事务”异常。

那么你就做错了。如果您在各处使用相同的连接字符串,并在调用使用 SqlConnection 的任何其他方法之前关闭每个 SqlConnection,则 Http 请求的所有数据访问都应重用单个 SqlConnection 和事务。

© www.soinside.com 2019 - 2024. All rights reserved.