2

使用中に誰も更新できないようにレコードをロックしたい。

しかし、レコードをロックした後、自分でもロックされたレコードを更新できません:(

レコードを更新する前にロックを解除する必要がありますか?

または、自分でロックしたレコードを更新する方法はありますか?

string query = "SELECT * FROM table1";
AdsCommand cmd = conn.CreateCommand();
cmd.CommandText = query;

AdsExtendedReader reader = cmd.ExecuteExtendedReader();
reader.Read();

int recordNo = reader.RecordNumber;
reader.LockRecord(recordNo);

// do something with table1 record
// while doing something, I need to lock the record before I update record

AdsCommand cm = new AdsCommand("UPDATE table1 SET field1 = 'UPDATED'", conn);
cm.ExecuteNonQuery();
4

2 に答える 2

4

(SQL操作ではなく)「直接」開かれたテーブルとSQL操作または他のテーブルインスタンスの間でレコードロックを共有することはできません。

1つの可能性は、ロックが取得された後に拡張リーダーを介して更新を行うことです。SetStringまたはSetValueを使用できます。

reader.SetString( colNumber, 'UPDATED' );

もう1つの可能性は、トランザクションのレコードを更新することです。その後、トランザクションがコミットされるまで、そのレコードはそのユーザーによってロックされたままになります。たとえば、次のステートメントを「no-op」(トリガーが含まれていないと仮定)として使用して、データを変更せずにトランザクションのレコードをロックできます。

UPDATE table1 set field1 = field1 WHERE pk=1;
于 2012-09-10T15:10:01.117 に答える
0

それをロックしてから、別の SQL ステートメントを使用して更新することはできません。これはクエリの別のインスタンスを開きますが、最初のインスタンスでテーブルをロックしたため、これは発生しません。ロックすることを心配せずに、UPDATEステートメントを実行してください。ADS は自動的にレコードをロックし、変更を加え、ロックを解除します。

// Note I added a WHERE statement with a dummy value for `finvno`, since your 
// select didn't provide one 
AdsCommand cm = new AdsCommand("UPDATE table1 SET field1 = 'UPDATED' WHERE finvno = 'SomeInvNo'", conn);
cm.ExecuteNonQuery();
于 2012-09-10T15:05:31.557 に答える