※ ChatGPTを利用し、要約された質問です(原文:sql serverロックしてしまう)
SQL Serverのロック問題と解決方法
このQ&Aのポイント
SQL Serverでのタイムカード(打刻)システムにおいて、朝と夕方の打刻が重なるときにロック(クエリーのタイムアウト)が発生する問題があります。この問題を解決するための修正方法として、トランザクションをやめて参照時にNOLOCKを使用する方法があります。
具体的には、社員マスタを更新する処理ではトランザクションを使用しており、この処理中に社員マスタ全体がロックされるため、他のプロセスからの同時アクセスが制限されます。一方、社員コードで指定したレコードのみを参照する処理では、NOLOCKを使用することでロックを回避できます。
ただし、トランザクションをやめることにより、データの整合性に関するリスクが生じます。そのため、トランザクションの必要性やデータの一貫性を考慮した上で、修正方法を選択する必要があります。また、他の影響も考慮する必要があります。
Aceess2010+sql server2012 expressでタイムカード(打刻)を20か所の営業所で利用しています。朝、夕方の打刻が重なる時にロック(クエリーでタイムアウト)が時々発生します。
※画面から社員コードを入力して出勤などのボタンを押そうとするときに、社員マスタを読み込むときにクエリーでタイムアウトが発生します
(1)社員1が退勤などを押して、社員マスタに更新する
Set cn = CurrentProject.Connection
cn.BeginTrans
sql = "UPDATE TM_社員マスタ"
sql = sql + " SET"
sql = sql + " 打刻ボタン=9"
sql = sql + " WHERE 社員コード='" & Me.社員コード & "'"
cn.Execute sql
cn.CommitTrans
cn.Close
Set cn = Nothing
(2)社員2が退勤を押す前に自分の社員コードを入力(ここでクエリータイムアウトになる)
sql = "SELECT * FROM TM_社員マスタ"
sql = sql + " WHERE 社員コード='" & Me.社員コード & "'"
rs.Open sql, cn
If Not (rs.EOF And rs.BOF) Then
Me.社員名 = rs!社員名
Me.雇用区分 = rs!雇用区分
(1)(2)の社員は別な社員で社員コードは違います
ロックを発生させないための修正としては、(1)のトランザクショをやめて、(2)のSELECTでNOLOCKをつけて参照すれば良いのでしょうか?
ちなみに、(1)でトランザクションをはずしてもUPDATE中は社員マスタ全体にロックがかかるのですか?それともWHEREで指定した社員コードのレコードだけロックがかかるですか?
あまり、SQL SERVERが詳しくないのですが、宜しくお願いします