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

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

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

VB SQL 同時接続における排他制御について

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

■96215 / inTopicNo.1)  VB SQL 同時接続における排他制御について
  
□投稿者/ 2307 (1回)-(2020/11/01(Sun) 02:05:42)

分類:[VB.NET/VB2005 以降] 

2020/11/01(Sun) 02:23:20 編集(投稿者)

・環境
vb compactframeworks 3.5
sqlserver2014 express
・目的
複数のハンディターミナルでスキャンしたデータをデータベースにinsertします。
その際、insertが同時に起こった際、一方を待機状態にし、他方の処理が終われば
順次insertを行うよう動作させたいと考えています。

ハンディ1→→→<insert>→→→→→→→→→→→→→→→→→→→<insert終了>→→→
ハンディ2→→→→<insert>→<ハンディ1が処理中の為待機>→→→→→→→→→<ハンディ1の処理が完了の為insert開始>→→

・質問
現在は以下のようなコードを考えています。

Private Sub Save()

sqlconn.Open()
tran = sqlconn.BeginTransaction

Try

sql="INSERT INTO テーブル名 WITH(TABLOCKX) ( テーブルの列名1 [ , テーブルの列名2 ]・・・) VALUES ( ‘値1′ [ , ‘値2’ ]・・・)"
com = New System.Data.SqlClient.SqlCommond(sql,sqlconn)
com.Transaction=tran
com.ExecuteNonQuery()

tran.Commit()

Catch

tran.Rollback()

finally

tran.Dispose()
sqlconn.Close()

End Try

End Sub

基本的な方針は間違っていないでしょうか?
また、ハンディ2機に実装し、上記を実行すると1機のみエラーメッセージとしてSQL EXCEPTIONが出ます。
SQL文よりWITH(TABLOCKX)を除けば出ません。
TABLOCKXでNO WAITなど特に設定しなければ待機し、ロックが取得出来次第順次実行すると思ったのですが
間違っているのでしょうか?
駄文で申し訳ありません。
質問に対する解答でなくとも、目的の動作をするためには一般的にはどうするかといったアドバイスだけ
でもいただければ幸いです。


引用返信 編集キー/
■96216 / inTopicNo.2)  Re[1]: VB SQL 同時接続における排他制御について
□投稿者/ WebSurfer (2140回)-(2020/11/01(Sun) 14:20:44)
No96215 (2307 さん) に返信

レスがつかないようですので一言・・・

> 基本的な方針は間違っていないでしょうか?

コードを見ると処理は 1 レコード INSERT するだけのようですが、早い者勝ちで
ダメな理由を教えてください。

UPDATE, DELETE なら同時実行制御という話はあると思いますが・・・
引用返信 編集キー/
■96217 / inTopicNo.3)  Re[2]: VB SQL 同時接続における排他制御について
□投稿者/ 2307 (2回)-(2020/11/01(Sun) 21:34:32)
No96216 (WebSurfer さん) に返信
> ■No96215 (2307 さん) に返信
>
> レスがつかないようですので一言・・・
>
>>基本的な方針は間違っていないでしょうか?
>
> コードを見ると処理は 1 レコード INSERT するだけのようですが、早い者勝ちで
> ダメな理由を教えてください。
>
> UPDATE, DELETE なら同時実行制御という話はあると思いますが・・・
引用返信 編集キー/
■96218 / inTopicNo.4)  Re[3]: VB SQL 同時接続における排他制御について
□投稿者/ 2307 (3回)-(2020/11/01(Sun) 22:41:41)
2020/11/01(Sun) 23:30:20 編集(投稿者)

No96217 (2307 さん) に返信
> ■No96216 (WebSurfer さん) に返信
>>■No96215 (2307 さん) に返信
>>
>>レスがつかないようですので一言・・・
>>
> >>基本的な方針は間違っていないでしょうか?
>>
>>コードを見ると処理は 1 レコード INSERT するだけのようですが、早い者勝ちで
>>ダメな理由を教えてください。
>>
>>UPDATE, DELETE なら同時実行制御という話はあると思いますが・・・

早いもの勝ちで構いません。

WebSurfer さんのご意見から違和感を感じ、調べ方を変えて調べなおしたところ
以下の記事を見つけました。
https://social.msdn.microsoft.com/Forums/sqlserver/ja-JP/168fb9da-515c-49eb-89c9-a3809bb12fdb/sqlserver20051239112398199681238812398653316532965324259911239821516?forum=sqlserverja
SQL2005ということでSQL2014ではどうなのか調べる必要はありそうですが
こちらの記事より、自分の知りたい内容というより知っておくべきだった内容が
分かったように思います。
先に述べたsqlexceptionエラーも排他うんぬんよりもこちらで記載していないキー関連に問題がありそうです。

解決済み
引用返信 編集キー/
■96219 / inTopicNo.5)  Re[4]: VB SQL 同時接続における排他制御について
□投稿者/ WebSurfer (2141回)-(2020/11/01(Sun) 23:37:10)
No96218 (2307 さん) に返信

WITH(TABLOCKX) なしで何の問題もないと思います。
引用返信 編集キー/
■96220 / inTopicNo.6)  Re[4]: VB SQL 同時接続における排他制御について
□投稿者/ WebSurfer (2142回)-(2020/11/02(Mon) 09:29:31)
No96218 (2307 さん) に返信

それから、 今の SQL の通り 1 レコード INSERT するだけであれば、トランザクション
処理も不要です。

> 先に述べたsqlexceptionエラーも排他うんぬんよりもこちらで記載していないキー関連に
> 問題がありそうです。

Number プロパティで取得できるエラーの種類を示す番号で原因が分かりますので(例えば
2627 なら重複制約違反)、調べてみてはいかがですか?

もし、主キーが重複することが SqlException の原因なら(それ排他制御の話ではないで
すが)、IDENTITY にして採番を SQL Server 任せにすることで解決できるかも。
引用返信 編集キー/
■96226 / inTopicNo.7)  Re[5]: VB SQL 同時接続における排他制御について
□投稿者/ WebSurfer (2144回)-(2020/11/03(Tue) 09:59:37)
質問者さんとしては解決済み ( No96218 参照) のようですので解決済みマークを付けて
おきます。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ