MAX + 1并行事务中的主键

时间:2014-06-02 12:42:09

标签: tsql

1)我知道身份和自我提升,我支持101%,但有时,你没有选择(如遗产系统/政治)

你好我假设我有一个这样的插入语句:

insert into SomeTable
select (select coallesce(max(ID),0)+1 from SomeTable),
       @ParameterValue

现在我有两个采用cmd行参数的应用程序并执行此操作:

//    Begin Transaction with isolation level ReadUncommited
for(i=0; i<100000; i++)
    // Run the insert statement with the cmd line parameters
//    Commit Transaction

现在,我希望(想要)在从SomeTable做select *之后看到应用程序轮流输入数据(例如,如果一个应用程序有cmd行值='A'而另一个'B'我会得到类似的东西:

1   A
2   A
3   B
4   B
5   A
6   B  (..., i think you get the point)

我试图通过以下方式实现:

insert into SomeTable with (tablock) - doesnt work, first one app finishes, then the other one

insert into SomeTable with (udplock) - i get PK violation

我慢慢变得绝望。所以,问题是,是否有某种锁,只在语句的持续时间内锁定表,但是直到事务结束才会保持这种状态?

非常感谢

哦,只是为了确定,id之间的空格不是问题

1 个答案:

答案 0 :(得分:0)

您可以将事务移动到循环内部并使用REPEATABLE READ
但这会影响响应时间

for(i=0; i<100000; i++) 
{
    SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
    GO
    BEGIN TRANSACTION;
    GO
    insert into SomeTable  
    select (select coallesce(max(ID),0)+1 from SomeTable), @ParameterValue
    GO
    COMMIT TRANSACTION;
    GO
}

一个tablock并且在另一个上有一个等待会更快 拿锁有很多开销 在桌面级别进行一次,插入100000是有效的 它是一个数据库,另一端是一个写头 同时写两个程序不会让它更快。