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之间的空格不是问题
答案 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是有效的 它是一个数据库,另一端是一个写头 同时写两个程序不会让它更快。