[C#] awaitしてるのにEntity FrameworkのDbContextでスレッド例外が出る

  • 投稿日:
  • by
  • Category:

この記事の続き。手こずっているシステムのバグ対応でまた躓いた。

Entity Frameworkなんて使ったことねぇよ。わかんねー

 

事の発端

とある画面を表示する際、初期表示データを取得するためのDBアクセス時にEntity Frameworkが例外エラーを吐くことがある。

A second operation was started on this context before a previous operation completed. This is usually caused by different threads concurrently using the same instance of DbContext. For more information on how to avoid threading issues with DbContext, see https://go.microsoft.com/fwlink/?linkid=2097913.
   at Microsoft.EntityFrameworkCore.Internal.ConcurrencyDetector.EnterCriticalSection()
   at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.AsyncEnumerator.MoveNextAsync()
   at Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.SingleAsync[TSource](IAsyncEnumerable`1 asyncEnumerable, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.SingleAsync[TSource](IAsyncEnumerable`1 asyncEnumerable, CancellationToken cancellationToken)
   at NameSpace.DataAccess.CustomerMasterAccess.GetItem(String customerCode) in C:\*****.cs:line 74
   at NameSpace.DataAccess.MasterAccess.GetCustomerName(String customerCode) in C:\*****.cs:line 125
 at NameSpace.Forms.DataInput.SetCustomerName(String customerCode, String customerCode2, String customerCode3) in C:\*****.cs:line 475
   at NameSpace.Forms.DataInput.DisplayItems() in C:\*****.cs:line 90
   at NameSpace.Forms.DataInput.Initial() in C:\*****.cs:line 71
   at System.Threading.Tasks.Task.<>c.<ThrowAsync>b__140_0(Object state)

"A second operation started on this context before a previous operation completed"というエラーメッセージでググってみると、「DbContext はスレッドセーフではないので、スレッド間で使いまわしてはいけない」という文言が見つかる。

つまりこのエラーは複数スレッドから同じDbContextにアクセスしてしまったため発生しているようだ(エラーメッセージに書いている通りやね)

SQL Server同士のデータ移行(エクスポート/インポート)に思った以上に手間取った

事の発端

  • SQL Server 2000から2016へのリプレース作業中
  • 客から「新システムに入力した一部データを旧システムに戻したい」という要望
  • SQL Server 2016から一部のデータを取り出してSQL Server 2000に入れることに

旧から新にデータ移行したことはあったけど、新から旧ってなかなかなくない...?

まぁ今回はそれに関係なく「SQL Serverのデータ移行がクソ面倒だった」というお話だけど。

[SQL Server]メンテナンスプランを使う時はSQL Server エージェントの設定を忘れないように

SQL Serverで起きた実際の話。

  • 一年前にリリース済みのシステムを改修。C#+SQL Serverのクラサバ業務系。
  • 客先へ訪問し本番環境へのリリースまで無事に終わった。
  • 念のためログを見てみると、定時バックアップが半年前から動いていなかった......。

 

調査の結果分かったこと。