5

このような状況があります。

クエはこんな感じ。

Select * from TABLE where ID = 1

(なんてクエリ:)

その後、その行のものを変更し、新しいIDで挿入します。

読み取りと挿入が完了するまで、他のクエリがqueryから最初の元の行を読み取らないようにしたい。その後、どうぞ。

基本的に、選択と挿入をトランザクションに入れ、挿入が完了するまでその行からの読み取りのみを防止する分離レベルを設定します。

OleDbTransaction私はSQL Server 6.5を使用しているため、有効です(そうです、正しく読んでください。理由は聞かないでください:)

分離レベルの説明を掘り下げていましたが、それらを完全に理解できず、問題の解決策を見つけることができませんでした。私の質問は、どの分離レベルに使用するOleDbTransactionかです。

私が明確だったことを願っています:)

ありがとう。

4

2 に答える 2

5

トランザクションの間、ロックを保持する必要があります。そして独占的にも。

現在、SQL Server 6.5 の正しいオプションがわかりません。ええと、199x以降、それを使用していません

BEGIN TRAN

--edit, changed to XLOCK, ROWLOCK, HOLDLOCK
SELECT * from TABLE WITH (XLOCK, ROWLOCK, HOLDLOCK) where ID = 1
...
INSERT

COMMIT

編集:

私の変更は、単一の行をトランザクションの最後まで (細かい粒度で) 排他的にロックすることを目的としています。

ただし、IIRC ROWLOCK は SQL Server 7 で追加され、6.5 はページ ロックのみでした。しかし、それはしばらく経ちました。当時は髪と歯がありました:-)

于 2010-10-15T16:01:35.867 に答える
-1

行にロックをかける必要があります。行を読み取る前にロックを作成し、行を更新した後にロックを解除します。

Oracleおよび同様のデータベースでは、読み取りはロックされないため、(トランザクションで)次のことを行う必要があります。

SELECT * FROM table WHERE id=? FOR UPDATE
...
UPDATE table ....

MS SQLでは、よくわかりません。最も簡単な方法は、データベースに接続されている2つのウィンドウを開き、両方でトランザクションを開始し、SELECTを実行して、2番目から選択できるかどうかを確認することです。 。ステートメントが返されない場合は、行がロックされていて問題がないことを意味します。

あなたの質問では、行を挿入するのではなく、選択した後に更新することを意味していると思います挿入すると新しい行が作成され、更新すると既存の行が変更されます)

于 2010-10-15T15:57:23.807 に答える