これは古い質問ですが、もう一度質問しています。 実際に私はテーブルのOracleのようなシーケンスを作成し、複数のスレッドと複数のJVMのすべてのプロセスがそれを平行して打つことに使用したい。DB内にJVMレベルとスレッドセーフシーケンスを作成する
これは、複数のJVMで動作するかどうかを尋ね、すべてのjvmのスレッドに常に一意の番号を提供するかどうかを尋ねるシーケンスストアドプロシージャです。
create table sequenceTable (id int)
insert into sequenceTable values (0)
create procedure mySequence
AS
BEGIN
declare @seqNum int
declare @rowCount int
select @rowCount = 0
while(@rowCount = 0)
begin
select @seqNum = id from sequenceTable
update sequenceTable set id = id + 1 where id = @seqNum
select @rowCount = @@rowcount
print 'numbers of rows update %1!', @rowCount
end
SELECT @seqNum
END
私はあなたのプロシージャに同期がないと思います。つまり、最初の 'select'ステートメントと' update'ステートメントに競合があります。選択と更新の中間で別のプロセスの同時選択が可能です別のプロセスの2つの同じ値を与えます。 (あなたの質問は、Javaとは関係ありません)。 –
@ M.Prokhorovと同意する - これは厳密にはJavaに関する質問ではありません。それでも、なぜ単に実際のシーケンスを使用しないのですか?マルチスレッドJavaアプリケーションでは、これを何年も使っています –
dbはシーケンスsybaseを提供しないため、このストアド・プロシージャは複数のJVMとスレッドから呼び出されるためです。また、私はそれが新しい値を追加したいと思うの同じバージョンで満たしているときにのみ更新が動作します、私はそれが私にうまくいくように異なる結果を与えるたびに、Javaユニットテストから500呼び出しでそれをテストしました。私はいくつかの事が当てはまるかもしれないことを確認するよう頼んでいます。 – user460293