ADOでSQL Serverにアクセスしていて、
下記のような記述でデータを取得しています。
行ロックするようにしたいのですが、うまく出来ません。
ヘルプなど見ると LockType=ltPessimistic で行ロックと書いてあるのですが
全くロックがかかりません。
また、SELECT でデータ取得する場合は、
「SELECT 列名 FROM テーブル名 WITH(UPDLOCK) WHERE〜」
で出来そうなのですが・・・。
下記のアクセス方法で行ロックする方法はありますでしょうか?
----------------------------------------------------
CoInitialize(NULL);
adocon = new TADOConnection(Application);
adocon->Connected=false;
adocon->ConnectionString = s; //s は接続文字列
adocon->LoginPrompt= False;
table = new TADOTable(Application);
table->LockType = ltPessimistic;
table->Connection = adocon;
table->TableName = "テーブル名";
table->Open();
Variant var[2];
var[0] = Variant(abc);
TLocateOptions opt;
bool atta = table->Locate("key",var[0],opt);
if ( atta )
{ AnsiString kekka = dp->FieldByName(列名)->AsString;
}
table->Close();
CoUninitialize();
----------------------------------------------------------
> 全くロックがかかりません。
CursorLocation とCursorType はどうなっていますか?
それぞれclUseServer とctKeyset である必要があります。
えーとね様
> CursorLocation とCursorType はどうなっていますか?
> それぞれclUseServer とctKeyset である必要があります。
CursorLocation とCursorType は特に指定していなかったので、
デフォルト値(ヘルプによるとclUseClient とctKeyset)だったと思います。
そこで、clUseServer とctKeysetを設定したのですが、ロックがかからず
同じ行が読めてしまいます。
ところで、もしロック出来たとして、ロックがかかる範囲というのは
上記ソースだとどこからどこまでになるのでしょうか?
> ロックがかかる範囲というのは
テーブル全体だと思います。オープンできなくなります。
Delphi2006 Update2 + Rollup1
Windows XP Pro SP2
SQL Server 2000 SP4
MDAC 2.81.1117.0
ロックがかかるのは、書き込みに対してではないでしょうか?読み取りはできないとRDBMSではなくなります。
編集 削除> オープンできなくなります。
プログラムAがltPessimistic でオープンしている時に
プログラムBがltPessimistic がオープンしようとすれば
待たされるという意味です。
了解しました。
編集 削除