コントローラが複数のマシンから複数のPOST(1分間に1000個)を受け取るため、これらのデータがすべてSQLデータベースに挿入されず、デッドロックが発生する。コントローラasync/SQLデータベースのデッドロックを待つ
どのようにして、このメソッドを同期して同時に使用するのではなく、後で挿入することができますか?
私は、このテストコントローラーで問題を再現することができる午前:
[HttpPost]
public async Task<ActionResult> Create([Bind(Include = "Value1,Value2,Id")] Test test)
{
if (ModelState.IsValid)
{
db.Tests.Add(test);
await db.SaveChangesAsync();
}
return new EmptyResult();
}
EDIT:このコードは、魔法のように、ピーターの答えのおかげで働きました。デッドロックはありません。パフォーマンスは良好であり、遅さは気づかれませんでした。
private SemaphoreSlim _semaphore = new SemaphoreSlim(1);
[HttpPost]
public async Task<ActionResult> Create([Bind(Include = "Value1,Value2,Id")] Test test)
{
await _semaphore.WaitAsync();
if (ModelState.IsValid)
{
db.Tests.Add(test);
await db.SaveChangesAsync().ConfigureAwait(false);
}
_semaphore.Release();
db.Dispose();
return new EmptyResult();
}
なぜタスクを待っているときに 'ConfigureAwait(false)'を使用していませんか? –
@PeterBruins 'ConfigureAwait'には何が関係していますか?また、opは、.NETコードではなくSQL Serverのデッドロックについて話しています。また、 'ConfigureAwait'はすべての問題の解決策ではありません。 –
あなたはdb.SaveChangesAsync()を待っているのですか?ConfigureAwait(false)?私は試してあなたに知らせるでしょう。 – expirat001