C#

EF Coreで悲観的ロック

こんにちは、弱小エンジニアのいすいです。

今日はEntity Framework Coreで悲観的ロックをする方法を教えます。

正直、概念に関しては合っているか自信がないのですが、やりたいことは達成できるとおもいます。

まちがっていたらごめんなさい。

 

やりたいこと

やりたいことしては以下です。

【API仕様】あるAPIの処理でDBのデータから条件Aをクリアしたら、新しくデータを追加できる

【問題】同時アクセスを受けたときに「条件A」を両方クリアし、両方ともデータが追加される

【理想】同時アクセスを受けた時、2番目の方が「条件A」をクリアしていない場合は2番目の方はデータが追加されてほしくない

【解決案】Select〜Insertの間、他のトランザクションのDBへのアクセスをロックしたい

解決案が悲観的ロックのことだと自分は認識しています。

↓参考URL(悲観的ロックとは)

https://qiita.com/NagaokaKenichi/items/73040df85b7bd4e9ecfc

 

SQL Server(他のDBでも)にはロックの概念(UPLOCKなど)が存在していますが、

insertを制御する機能は見当たらず、そもそもトランザクションを制御するのはDBでは無理なのでは?という結論に至りました。

(DBレベルでのロックは更新ロックが限界だと思われる)

 

解決方法

トランザクションにはトランザクション分離レベルというものが存在し、

トランザクション中のDBへのアクセスを段階ごとに制御できるらしい。

 

↓参考URL(トランザクション分離レベル(対象SQL Server)とは)

https://qiita.com/song_ss/items/38e514b05e9dabae3bdb

 

上記によるとトランザクション分離レベルはデフォルトではREAD COMMITTEDになっているらしく、SERIALIZABLEにすれば、悲観的ロックができそう

 

それがわかったら、Entity Framework Coreでトランザクション分離レベルを設定しよう。(SQL Serverでもトランザクション分離レベルは設定できそうだが、EF Coreの方が早そう)

 

↓参考URL(EF Coreでのトランザクション(Microsoft公式)について)

https://docs.microsoft.com/ja-jp/ef/core/saving/transactions

 

上記によると、EF CoreではTransactionScopeでトランザクション分離レベルを設定できるみたい

なので、悲観的ロックをしたい処理を下記で囲めば良い

using (var scope = new TransactionScope(
    TransactionScopeOption.Required,
    new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted }))
{
   // 処理(select~insert)
    scope.complete();
}

実際にinsert処理に該当するSaveChanges()にブレークポイントを置いて、同時アクセスしてみてください。

ちゃんと条件に一致してない2番目の方はエラーで返されると思います。

 

以上でEF Coreの悲観的ロックが達成できること祈ります。

 

C#やWPFで参考すべきサイト

こんにちは弱小エンジニアのいすいです。

最近WPFでの開発をすることになりました。

さて、とWPFの書籍を開いてみると、、、

まったくわからん( ´∀` )

WPFって書籍少ないし、日本語の参考サイトも少ないんですよね。。汗

そんなこんなで本日は、
WPF初級学習で参考になったサイトを紹介します。

新しく発見したサイトは随時更新します。

それでは行ってみよう!!!

↓↓↓

ピーコックアンダーソン

見やすく、分かりやすい。WPF初心者にはうってつけ

一つ目が、ピーコックアンダーソンさんのブログです。

この方は17年C#に携わってきた現役のプログラマーです。

Udemyでは20以上のコース、書籍も多数出版といった実績も持っています。

こちらのブログを紹介する一番の理由は、
WPF初心者にわかりやすいという点です。

たいていのWPF関連サイトでは、専門用語が多かったり、手順を省略していたり、0から教えてくれるものはなかなかありません。

それに対して、ピーコックアンダーソンさんのブログでは、WPF初心者に焦点をあてて解説いただいています。

また、レイアウト、デザインが美しいのもおすすめの理由ですね。

FromPage

FromPageは「open棟梁wiki」「OSSコンソーシアム .NET開発基盤部会」が運営するサイトです。

.NETの重鎮たちが運営しているだけあって非常に細かくxamlについて載っています。

無料なのが不思議なほどです。

わかりやすく何でも載っているので、とりあえずこのサイトで調べてみると良いかもしれません。

随時更新します。

今は二つだけですみません。。

PAGE TOP