0
INSERT stuff
SET computed = 'working'
WHERE id = (SELECT max(id) from STUFF WHERE x = y)

このステートメントをSQLServer2005SP1でアトミックにします。

分離レベルを変更せずにこれを行う方法はありますか?

Identity列をpkとしてテーブルへの挿入をシミュレートする必要があります。私の現在のテーブルには、pkとしてIdentityフィールドがありませんが、そのように動作する必要があります。したがって、疑似IDフィールドの最大値を取得し、1を追加してから、次の行を挿入する必要があります。

4

2 に答える 2

2

値をロックダウンする1つの方法は、SERIALIZABLE分離レベルを使用することです。

DECLARE @id int;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN TRAN
SELECT TOP(1) @id id from STUFF WHERE x = y ORDER BY id DESC;
INSERT stuff (id, ...) VALUES (@id, ...);
COMMIT
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

できるだけ短くしてください。

于 2012-10-29T20:39:17.657 に答える
1

IDENTITY列を追加できない場合、IDENTITY列を含む別のテーブルを作成できますか?次に、そのテーブルに挿入し、@@ IDENTITYを使用して、シーケンスを必要とするテーブルに挿入します。この手法では、最後の番号が記憶されるため、再利用された値は取得されません。

同様の手法を使用して、2012年より前のバージョンのSQL ServerでOracleのシーケンス(テーブルに依存しない)をシミュレートします。

http://www.sqlmag.com/article/tsql3/simulating-oracle-sequences-in-t-sql-code

必要に応じて、これらのシーケンステーブルをいつでも別のスキーマにスローできます。

于 2012-10-29T21:33:13.920 に答える