线程安全的顺序是老问题,但可以肯定的我又一次问。 其实我已经在Oracle中创建的序列,例如有一张桌子和希望与多个线程使用多个Java虚拟机的所有过程中会击中它平行。创建JVM水平和DB
以下是序列存储过程只是想问这是否可以与多个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'语句有一个竞赛 - 可以从另一个进程的并发选择中间选择和更新另一个过程,从而给你两个相同的值。 (顺便提一下,你的问题与Java无关)。 –
同意@ M.Prokhorov - 这不是严格的Java问题。即便如此,为什么你不会简单地使用一个实际的序列?多线程Java应用程序多年来一直在使用这些应用程序 –
因为db不提供序列sybase,并且此存储过程将由多个JVM和线程调用。此外,只有当条件与我相同版本的条件满足时,update才会起作用,否则它会增加新的值,我已经用来自Java单元测试的500次调用对它进行了测试,并且每次给出的结果对我来说都不错。我要求确认可能是一些事件发生。 – user460293