gpt4 book ai didi

sql - 在一个事务 SQL 中删除和插入

转载 作者:行者123 更新时间:2023-12-02 23:18:44 28 4
gpt4 key购买 nike

我只是想问封装到事务中是否总是第一个查询被执行?例如我有50万条记录要删除,50万条记录要插入,是否有可能锁定?实际上我已经测试了这个查询并且它工作正常,但我想确定我的假设是否正确。

注意:这将删除并插入相同的记录,并可能更新其他列。

BEGIN TRAN;
DELETE FROM OUTPUT TABLE WHERE ID = (1,2,3,4 etc)
INSERT INTO OUTPUT TABLE Values (1,2,3,4 etc)
COMMIT TRAN;

最佳答案

在事务内,所有写锁(为修改而获取的所有锁)都必须遵守 strict two phase locking规则。后果之一是在事务中获取的写 (X) 锁在事务提交之前无法释放。所以是的,DELETE 和 INSERT 将按顺序执行,并且在执行 INSERT 时将保留 DELETE 期间获取的所有锁。

请记住,在事务中删除 500k 行会将锁升级为一个表锁,请参阅 Lock Escalation .

在单个事务中删除 500k 行并插入 500k 行虽然可能是正确的,但却是一个坏主意。如果可能的话,您应该避免如此大的工作量和长时间的交易。长事务将日志固定到位,产生阻塞和争用,增加恢复和数据库启动时间,增加 SQL Server 资源消耗(锁需要内存)。

您应该考虑小批量执行操作(也许一次 10000 行),使用 MERGE而不是 DELETE/INSERT(如果可能),最后但并非最不重要的一点是,考虑分区滑动窗口实现,参见 How to Implement an Automatic Sliding Window in a Partitioned Table .

关于sql - 在一个事务 SQL 中删除和插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26338431/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com