1

私はSQL Server 2005データベースを持っています。 Table Aには、列に複数の行にまたがる別の手動のId列と同様に、列にID列があります。 2番目のid列の形式は'0000000098'であり、文字列でなければなりません。データ型を変更することはできません。SQL Serverの機能 - 重複を防止する

Function Aは、最大IDの列値を取得し、1ずつ増やして文字列としてキャストします。

保存したprocが新しいIDを取得した後、このIDを使用していくつかの挿入を行います。

更新が行われる前に、2つのクライアントがストアドプロシージャを実行して同じIDを取得しないようにするにはどうすればよいですか? procが処理されるか、より効率的な方法があるまで、テーブルaを読み込みからロックすることはできますか?

データタイプや構造を変更できる場合は簡単ですが、できません。

答えて

1

あなたが単一のUPDATEステートメントとしてのあなたの機能では、明示的なロックは必要ありません。UPDATEステートメントは更新ロック(U)を必要とします。これは排他的です。 2人の読者が同時に同じ行に更新ロックを取得することはできません。 SELECTUPDATE前に - - あなたは2段階のプロセス持っている必要がある場合は

UPDATE dbo.TableA 
SET ManualID = CAST(CAST(ManualID AS INT) + 1 AS VARCHAR(20)) 
OUTPUT Inserted.ManualID -- return the newly inserted manual ID for your use 
WHERE .......... 

はその後、私は、単一のUPDATEまたは以来、どちらの場合にもSELECT

DECLARE @OldManualID VARCHAR(20) 

BEGIN TRANSACTION 

SELECT @OldManualID = ManualID 
FROM dbo.TableA WITH (UPDLOCK) 
WHERE........ 

-- do something with that manual ID 

UPDATE dbo.TableA 
SET ManualID = (new value of ManualID) 
WHERE .......... 

COMMIT TRANSACTION 

WITH (UPDLOCK)ヒントを使用したいですSELECT/UDPATEは更新ロックのもとで実行されますが、同時に2つのプロセスで実行することはできません。私はあなたがさらにロックを必要とするとは思わない - 最も完全にテーブルロックではありません....

+0

それは良い考えです。おそらく1)関数を実行して次のIDを取得する2)次の人が次のIDを取得する3)最初の人がinsert文を実行する2番目の人が次のID ...両方が同じIDを持つことになります。これは可能ですか、または挿入を行っているので、自動的にそのテーブルをロックしますか?それは会計特有のテーブルのためです、私はIDのそれを複製する余裕がありません...会計の悪夢は他のどの種類よりも悪いです! ;) –

+1

あなたの投稿をもう一度読んでみてください...感謝します、ありがとう! (子供の周り - 集中することはできません) –

0

はい、テーブルをロックできます。あなたはトランザクション内のすべてのことを行う必要があります。初めてテーブルを読むときに、ヒント(updlock、holdlock)またはさらには(TABLOCKX)付きの排他的な連続ロックを置くことができます

関連する問題