我只是想问封装到事务时是否总是第一个查询被执行?例如我有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;
在事务中,所有写锁(为修改而获取的所有锁)都必须遵守严格的两相锁定 http://en.wikipedia.org/wiki/Two-phase_locking规则。后果之一是在事务中获取的写 (X) 锁在事务提交之前无法释放。所以是的,DELETE 和 INSERT 将按顺序执行,并且在执行 INSERT 时将保留 DELETE 期间获取的所有锁。
请记住,在事务中删除 500k 行会将锁升级为一个表锁,请参阅锁升级 http://technet.microsoft.com/en-us/library/ms184286(v=sql.105).aspx.
在单个事务中删除 500k 行并插入 500k 行虽然可能是正确的,但却是一个坏主意。如果可能的话,您应该避免如此大的工作量和长时间的交易。长事务将日志固定到位,产生阻塞和争用,增加恢复和数据库启动时间,增加 SQL Server 资源消耗(锁需要内存)。
您应该考虑小批量执行操作(可能一次 10000 行),使用MERGE http://msdn.microsoft.com/en-us/library/bb510625.aspx而不是 DELETE/INSERT(如果可能),最后但并非最不重要的一点是,考虑分区滑动窗口
实施,参见如何在分区表中实现自动滑动窗口 http://technet.microsoft.com/en-us/library/aa964122(v=sql.90).aspx.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)