*编辑:在这里的答案中,解决方案没有什么意义,我在Python中使用了SQLAlchemy,这是一个ORM。我在事务中执行下面的delete语句,但从未提交。这导致大约10个打开的事务发生,最终需要回滚所有事务,从而锁定整个表,直到回滚完成。
给定下表结构,记录将以最近日期时间的update_time连续插入。到DB的一个单独连接是定期修剪旧记录,其日期大于2周。
表结构:
以下Insert正在以不同的值频繁运行:
重复以下delete语句,直到需要为止,然后运行select,以查看进程是否完成
delete top(5000) from trade_options with (READPAST) where update_time < '<Two Weeks Ago>'
Activity显示删除正在锁定,插入正在等待( LCK_M_IX):
谢谢
**编辑:以下是作为脚本输出的索引/键
CREATE NONCLUSTERED INDEX [IX_order_option] ON [dbo].[order_option]
(
[update_time] DESC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
ALTER TABLE [dbo].[order_option] ADD PRIMARY KEY CLUSTERED
(
[exchange_id] ASC,
[symbol] ASC,
[update_time] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
发布于 2019-09-25 07:27:44
发布于 2019-09-25 06:30:57
删除行时应使用较小的块。但这解决不了你的问题。如果在事务中执行DELETE语句,则行锁可能升级到表锁。
我不知道能否在插入过程中应用表锁?它的意思是使用“WITH(XLOCK)”选项。这是您的应用程序允许的吗?
更重要的是,检查索引并不是个坏主意。你有“update_time”专栏的吗?
这个故事的寓意是,锁定是正常的Server行为,您无法避免这种行为。你唯一能做的就是缩短等待时间。
internet 生成自定义阻塞进程报告上有一个资源可以帮助您轻松检测锁定。
https://dba.stackexchange.com/questions/249550
复制相似问题