【发布时间】:2014-10-13 11:00:54
【问题描述】:
我只是想问一下,封装到事务时是否总是第一个查询?例如,我要删除 500 k 记录,要插入 500 k 记录,是否有可能锁定? 实际上我已经测试了这个查询,它工作正常,但我想确定我的假设是否正确。
注意:这将删除和插入相同的记录,并可能在其他列上更新。
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;
【问题讨论】:
-
您使用的是哪个 DBMS?后格雷斯?甲骨文?
-
这些被认为是同一事务/范围内不同的 SET 操作。所以,是的,事务中不应该有锁定。这并不是说对这些行的其他请求将没有锁定。
-
第一个查询总是先执行吗?我执行了这个查询 10 次,它总是先执行 DELETE 语句
-
是的。它总是按顺序执行。交易不会改变这一点。请参阅此处的工人部分Understanding how SQL Server executes a query。你可能会考虑
MERGE,不过如果在 2008 年以上。 -
删除和插入的行将在事务期间被锁定,语句顺序执行。请注意,如果您有多个这些事务同时运行,您可能会遇到阻塞/死锁,尤其是在指定相同 ID 值的情况下。数据库中的值将反映最后提交的事务。
标签: sql sql-server