34,593
社区成员
发帖
与我相关
我的任务
分享
ALTER PROCEDURE [dbo].[UpdateReadTest]
AS
BEGIN
BEGIN TRANSACTION
declare @num int
select @num = Num from ReadTest rowlock where Id = 1
set @num = @num + 1
update ReadTest set Num = @num where Id = 1
--update ReadTest set Num = Num + 1 where Id = 1
COMMIT
END
static void changeNumTran(object id)
{
thradNum++;
for (int i = 0; i < 10000; i++)
{
int num;
SqlParameter param = new SqlParameter("@id", id);
DbHelperSQL.RunProcedure("UpdateReadTest2", new[] { param }, out num);
}
thradNum--;
}
// 将原始数据清零
DbHelperSQL.ExecuteSql("update ReadTest set Num = 0");
DateTime begin = DateTime.Now;
for (int j = 1; j <= 20; j++ )
for (int i = 0; i < 5; i++)
{
var thread = new Thread(ChangeNum);
//var thread = new Thread(changeNumTran);
thread.Start(j);
}
Thread.Sleep(100);
while (thradNum > 1)
Thread.Sleep(100);
ALTER PROCEDURE [dbo].[UpdateReadTest2]
@id int
AS
BEGIN
BEGIN TRANSACTION
declare @num int
select @num = Num from ReadTest where Id = @id
set @num = @num + 1
update ReadTest set Num = @num where Id = @id
waitfor DELAY '000:00:00.01' -- 延时,不让并发时不让数据库的io和cpu成为瓶颈
--update ReadTest set Num = Num + 1 where Id = 1
COMMIT
END
--try
from ReadTest with(holdlock,tablockx)
select @num = Num from ReadTest with(rowlock) where Id = 1