22,210
社区成员
发帖
与我相关
我的任务
分享
create proc test
@sno int
as
BEGIN
--1.aa中每个sno有10000条数据
insert into a (value,sno) select from aa where sno = @sno
--2.bb中每个sno有10000条数据
insert b (value,sno) select from bb where sno = @sno
--3.更新数据
BEGIN TRAN
BEGIN TRY
SELECT * FROM a WITH(XLOCK, ROWLOCK) INNER JOIN b WITH(XLOCK, ROWLOCK) ON a.sno = b.sno and a.sno = @sno
update a set a.value = b.value from a INNER JOIN b ON a.sno = b.sno and a.sno = @sno
COMMIT TRAN;
END TRY
BEGIN CATCH
DECLARE @errMsg NVARCHAR(MAX)
SET @errMsg=ERROR_MESSAGE()
RAISERROR(16,1,@errMsg)
ROLLBACK TRAN;
END CATCH
return 0
END
go
可能跟只锁了一个表有关系。
按上面的来试下。
不过, 你这一次就要更新那么多的记录, 实际上多线程少线程、加锁什么的已经没太意义了。
不需要那么多高大上的东西, 数据库同一个表的不同进程更新本身就是有影响的。
只留一个进程来更新, 每次只更新 100~1000 条, 循环更新, 试下效果。
注意:数据库的恢复模式改成简单, 更新速度会加快。
另外, 减少不必要的触发器、索引也能加快更新的速度。