C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: 楽観ロック・悲観ロックの違いに関して


(過去ログ 55 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■31180 / inTopicNo.1)  楽観ロック・悲観ロックの違いに関して
  
□投稿者/ 黒ひげ (1回)-(2009/01/16(Fri) 11:01:23)

分類:[データベース全般] 

環境;Visual Studio 2008 (評価版)
言語;C#
DB;SQL Server 2005

お世話になります。この度、C#で作成した画面から複数件のレコードを、
SQL ServerにあるDB01のtable1に更新する処理を実装中ですが、
楽観ロックで更新をしなければなりません。

今まで悲観的ロック・楽観的ロックなどを恥ずかしながら意識したことがなかったので、
早速調べてみたのですが、トランザクションの開始終了やcommit、rollbackの位置が
わからなく投稿させて頂きました。

仕様としましては、たとえば10件レコードがあります。
ループ処理の中で8件目までは正常でも、9件目でエラーが発生した場合は、
正常に終了した8件も無効とし、ロールバックを行います。

調べた結果、私なりに考えたものを下記に記載させて頂きます。

間違いをご指摘お願い致します。

[悲観ロック]
 トランザクション開始
 try
 {
  for (10件)
  {
    アップデート処理
  }
  コミット
 }
 catch (Exception)
 {
  ロールバック
 }
 トランザクション終了

トランザクション内ではロックするレコードの指定をしていないので
トランザクションが開始されたらテーブルロック扱いとなる??


[楽観ロック]
 トランザクション開始
 try
 {
  for (10件)
  {
   select 〜 for update 〜 ※この指定をすることでテーブルロックからレコードロックにかわる??
   if (1件)
   {
    アップデート処理
   }
   else
   {
    ロールバック
   }
  }
  コミット
 }
 catch (Exception)
 {
  ロールバック
 }
 トランザクション終了

引用返信 編集キー/
■31182 / inTopicNo.2)  Re[1]: 楽観ロック・悲観ロックの違いに関して
□投稿者/ 黒ひげ (2回)-(2009/01/16(Fri) 11:08:05)
No31180 (黒ひげ さん) に返信
> 環境;Visual Studio 2008 (評価版)
> 言語;C#
> DB;SQL Server 2005
>
> お世話になります。この度、C#で作成した画面から複数件のレコードを、
> SQL ServerにあるDB01のtable1に更新する処理を実装中ですが、
> 楽観ロックで更新をしなければなりません。
>
> 今まで悲観的ロック・楽観的ロックなどを恥ずかしながら意識したことがなかったので、
> 早速調べてみたのですが、トランザクションの開始終了やcommit、rollbackの位置が
> わからなく投稿させて頂きました。
>
> 仕様としましては、たとえば10件レコードがあります。
> ループ処理の中で8件目までは正常でも、9件目でエラーが発生した場合は、
> 正常に終了した8件も無効とし、ロールバックを行います。
>
> 調べた結果、私なりに考えたものを下記に記載させて頂きます。
>
> 間違いをご指摘お願い致します。
>
> [悲観ロック]
>  トランザクション開始
>  try
>  {
>   for (10件)
>   {
>     アップデート処理
>   }
>   コミット
>  }
>  catch (Exception)
>  {
>   ロールバック
>  }
>  トランザクション終了
>
> トランザクション内ではロックするレコードの指定をしていないので
> トランザクションが開始されたらテーブルロック扱いとなる??
>
>
> [楽観ロック]
>  トランザクション開始
>  try
>  {
>   for (10件)
>   {
>    select 〜 for update 〜 ※この指定をすることでテーブルロックからレコードロックにかわる??
>    if (1件)
>    {
>     アップデート処理
>    }
>   }
>   コミット
>  }
>  catch (Exception)
>  {
>   ロールバック
>  }
>  トランザクション終了
>
引用返信 編集キー/
■31183 / inTopicNo.3)  Re[2]: 楽観ロック・悲観ロックの違いに関して
□投稿者/ 黒ひげ (3回)-(2009/01/16(Fri) 11:09:01)
[楽観ロック]のところでif文のelseがいらなかったため削除しました。
引用返信 編集キー/
■31186 / inTopicNo.4)  Re[3]: 楽観ロック・悲観ロックの違いに関して
□投稿者/ やじゅ (909回)-(2009/01/16(Fri) 11:22:38)
やじゅ さんの Web サイト
No31183 (黒ひげ さん) に返信

>ループ処理の中で8件目までは正常でも、9件目でエラーが発生した場合は、
>正常に終了した8件も無効とし、ロールバックを行います。

なら、
楽観的ロックのコミットとロールバックの位置は、悲観的ロックと同じでいいですよ。

引用返信 編集キー/
■31189 / inTopicNo.5)  Re[1]: 楽観ロック・悲観ロックの違いに関して
□投稿者/ biac (18回)-(2009/01/16(Fri) 11:32:27)
biac さんの Web サイト
No31180 (黒ひげ さん) に返信
> 仕様としましては、たとえば10件レコードがあります。
> ループ処理の中で8件目までは正常でも、9件目でエラーが発生した場合は、
> 正常に終了した8件も無効とし、ロールバックを行います。

> [悲観ロック]
>  トランザクション開始
>  try
>  {
>   for (10件)
>   {
>     アップデート処理
>   }
>   コミット
>  }
>  catch (Exception)
>  {
>   ロールバック
>  }
>  トランザクション終了

ここ↑の流れは、 楽観的ロック (オプティミスティック同時実行制御) でも同じです。
この部分を 「更新トランザクション処理」 と呼ぶことにすると…

◆ 悲観的ロック (ペシミスティック同時実行制御)
1. 画面に表示するためのデータを取得。 このときにロックを掛ける。
2. ユーザー操作、更新指示
2'. (他のユーザー) ロックされているため、 更新画面は使えない。
3. 更新トランザクション処理 (1.でロックしているため、単純な UPDATE 文で OK)

◆ 楽観的ロック (オプティミスティック同時実行制御)
1. 画面に表示するためのデータを取得。 このときにロックを掛けない。
2. ユーザー操作、更新指示
2'. (他のユーザー) ロックされていないので、 同じ更新画面を利用可能。
3. 更新トランザクション処理 (1.でロックしていないので、他ユーザーが変更したかどうかを確認する UPDATE 文を書かねばならない)


ADO.NET なら、 MSDN の次の記事が参考になるかと思います。
http://msdn.microsoft.com/ja-jp/library/aa0416cz.aspx
> .NET Framework 開発者ガイド
> オプティミスティック同時実行制御 (ADO.NET)

簡単な要件の場合だと、 DataAdapter に 「お任せ」 で、 勝手にオプティミスティック同時実行制御をやってくれますよ。
引用返信 編集キー/
■31203 / inTopicNo.6)  Re[1]: 楽観ロック・悲観ロックの違いに関して
□投稿者/ カドルドエグ (69回)-(2009/01/16(Fri) 13:25:10)
No31180 (黒ひげ さん) に返信
具体的な方法ではなくて申し訳ないですが、
考え方の参考として^^;

http://blogs.sqlpassj.org/akiraonishi/articles/5026.aspx
引用返信 編集キー/
■31212 / inTopicNo.7)  Re[2]: 楽観ロック・悲観ロックの違いに関して
□投稿者/ 黒ひげ (5回)-(2009/01/16(Fri) 16:38:14)
やじゅ様
biac様
カドルドエグ様

アドバイス本当にありがとうございます。
何となくではありますが、確信が持てました。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -