こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

sql serverロックしてしまう

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が詳しくないのですが、宜しくお願いします

投稿日時 - 2016-05-24 11:15:06

QNo.9177228

すぐに回答ほしいです

質問者が選んだベストアンサー

このソースだとおそらくリンクテーブルを使っているのだと思います。リンクテーブルは読み込みの制御が出来ません。つまりAccessからNOLOCKなどを出してもSQLサーバーには届かないということです。リンクテーブルは近所のデーターを一緒に持ってきてAccessの中でクエリを掛けるので全員が同じことをすればロックは掛かります。
回避策はSet cn = CurrentProject.ConnectionをADOの接続に変更してTransactSQLで書き直すことです。
Dim CN As ADODB.Connection
Set CN = New ADODB.Connection
CN.Provider = "SQLOLEDB"
CN.ConnectionString = "Persist Security Info=true;" & _
"Data Source=サーバー名;" & _
"Initial Catalog=XXDB;" & _
"User ID=XXXX;" & _
"Password=1234"
CN.Open ’

この場合SQLの認証をドメインにしたほうが良いですけど、アプリケーションユーザーIDを作ってSQL認証でも構いません。推奨はされていませんが。

投稿日時 - 2016-05-24 12:18:17

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問