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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.96215 の関連記事表示

<< 0 >>
■96215  VB SQL 同時接続における排他制御について
□投稿者/ 2307 -(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など特に設定しなければ待機し、ロックが取得出来次第順次実行すると思ったのですが
    間違っているのでしょうか?
    駄文で申し訳ありません。
    質問に対する解答でなくとも、目的の動作をするためには一般的にはどうするかといったアドバイスだけ
    でもいただければ幸いです。

親記事 /過去ログ166より / 関連記事表示
削除チェック/

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

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

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

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

    UPDATE, DELETE なら同時実行制御という話はあると思いますが・・・
記事No.96215 のレス /過去ログ166より / 関連記事表示
削除チェック/

■96217  Re[2]: VB SQL 同時接続における排他制御について
□投稿者/ 2307 -(2020/11/01(Sun) 21:34:32)
    No96216 (WebSurfer さん) に返信
    > ■No96215 (2307 さん) に返信
    >
    > レスがつかないようですので一言・・・
    >
    >>基本的な方針は間違っていないでしょうか?
    >
    > コードを見ると処理は 1 レコード INSERT するだけのようですが、早い者勝ちで
    > ダメな理由を教えてください。
    >
    > UPDATE, DELETE なら同時実行制御という話はあると思いますが・・・
記事No.96215 のレス /過去ログ166より / 関連記事表示
削除チェック/

■96218  Re[3]: VB SQL 同時接続における排他制御について
□投稿者/ 2307 -(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エラーも排他うんぬんよりもこちらで記載していないキー関連に問題がありそうです。
記事No.96215 のレス / END /過去ログ166より / 関連記事表示
削除チェック/

■96219  Re[4]: VB SQL 同時接続における排他制御について
□投稿者/ WebSurfer -(2020/11/01(Sun) 23:37:10)
    No96218 (2307 さん) に返信

    WITH(TABLOCKX) なしで何の問題もないと思います。
記事No.96215 のレス /過去ログ166より / 関連記事表示
削除チェック/

■96220  Re[4]: VB SQL 同時接続における排他制御について
□投稿者/ WebSurfer -(2020/11/02(Mon) 09:29:31)
    No96218 (2307 さん) に返信

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

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

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

    もし、主キーが重複することが SqlException の原因なら(それ排他制御の話ではないで
    すが)、IDENTITY にして採番を SQL Server 任せにすることで解決できるかも。
記事No.96215 のレス /過去ログ166より / 関連記事表示
削除チェック/

■96226  Re[5]: VB SQL 同時接続における排他制御について
□投稿者/ WebSurfer -(2020/11/03(Tue) 09:59:37)
    質問者さんとしては解決済み ( No96218 参照) のようですので解決済みマークを付けて
    おきます。
記事No.96215 のレス / END /過去ログ166より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -