大量插入 更新 同时 一张表 意向排他 排他 锁表 行页粒度锁

小土bibox 2018-06-23 12:10:02
公司有两个业务,用同一张表T_man,一个业务定时大量插入数据到这个表类似

begin tran
DECLARE CURSOR for select name from User where 1=1;
FETCH NEXT FROM
insert into T_man values();
end tran

这个插入的时候表上有意向排它锁IX,插入行排它锁X。插入的内容比较多,插入耗时比较久20多秒。数量比较大。

这个时间如果另个业务更新这个表
begin tran
update T_man set 1=1
end tran
这个业务就需要等待第一个业务执行完成才能更新,第二个业务就会看起来跟卡死,一样。

有没有办法第一个插入时不锁表,只是行或者页级别锁。这样第二个也可以操作这个表
对锁不太熟,忘大神帮忙看看。
...全文
200 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
小土bibox 2018-06-23
  • 打赏
  • 举报
回复
where 后还有其他条件,不是全部更新,是部分更新,大概50、60条记录查询出来更新的样子。
插入一次插入50、60条记录,更新只有两三条,我在where条件上加了非聚集索引。不过貌似还是锁到全表了。

我加日志点,
发现更新的在等待这个插入的意向锁给释放,
插入有许多判断条件这个T_man是个具体信息,还有一个类似总体信息的表T_info和一些需要判断条件表。
要确保一个记录插入成功,是更新T_info 和T_man还有一些陪衬的表。因为多所以加了个事务。
薛定谔的DBA 2018-06-23
  • 打赏
  • 举报
回复
插入 或 更新的两个业务只涉及这一张表?where 条件没其他了吗?update 也是整张表??

要是这样,第一个业务不必要用游标啊,直接:insert into T_man select name from User where 1=1;


插入肯定要意向锁,想提高插入的速度,索引、触发器、约束 等都不要最好。如果需要,select name from User 的时候,就先排好序,表 T_man 的聚集索引也是同样的顺序,这样插入数据的时候,这行数据都是在索引树的最末尾插入,不会导致整个聚集索引数据往后移动。

插入一般不控制,控制的是查询、更新、删除之类的,处理数据太多则需要少量操作(包括insert),这些操作都回加条件进行处理。如果你是日常的全表操作的维护作业,那也得控制分批执行。 操作整张表的,不会有这样的业务。


22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧