ADOで排他制御する方法


JJKK  2006-11-21 20:28:45  No: 24008  IP: 192.*.*.*

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();
----------------------------------------------------------

編集 削除
えーとね  2006-11-22 06:40:38  No: 24009  IP: 192.*.*.*

> 全くロックがかかりません。
CursorLocation とCursorType はどうなっていますか?
それぞれclUseServer とctKeyset である必要があります。

編集 削除
JJKK  2006-11-22 17:44:28  No: 24010  IP: 192.*.*.*

えーとね様
> CursorLocation とCursorType はどうなっていますか?
> それぞれclUseServer とctKeyset である必要があります。

CursorLocation とCursorType は特に指定していなかったので、
デフォルト値(ヘルプによるとclUseClient とctKeyset)だったと思います。

そこで、clUseServer とctKeysetを設定したのですが、ロックがかからず
同じ行が読めてしまいます。

ところで、もしロック出来たとして、ロックがかかる範囲というのは
上記ソースだとどこからどこまでになるのでしょうか?

編集 削除
えーとね  2006-11-23 06:11:12  No: 24011  IP: 192.*.*.*

> ロックがかかる範囲というのは
テーブル全体だと思います。オープンできなくなります。

Delphi2006 Update2 + Rollup1
Windows XP Pro SP2
SQL Server 2000 SP4
MDAC 2.81.1117.0

編集 削除
HOta  2006-11-23 07:51:30  No: 24012  IP: 192.*.*.*

ロックがかかるのは、書き込みに対してではないでしょうか?読み取りはできないとRDBMSではなくなります。

編集 削除
えーとね  2006-11-23 09:25:56  No: 24013  IP: 192.*.*.*

> オープンできなくなります。
プログラムAがltPessimistic でオープンしている時に
プログラムBがltPessimistic がオープンしようとすれば
待たされるという意味です。

編集 削除
HOta  2006-11-23 15:52:33  No: 24014  IP: 192.*.*.*

了解しました。

編集 削除