【问题标题】:Delete and Insert Inside one Transaction SQL在一个事务 SQL 中删除和插入
【发布时间】: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


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    来自documentation on TRANSACTION(强调我的):

    BEGIN TRANSACTION 表示一个点,在该点处,a 引用的数据 连接在逻辑上和物理上是一致的。如果错误是 遇到,在 BEGIN TRANSACTION 之后进行的所有数据修改 可以回滚以将数据返回到此已知状态 一致性。 每笔交易都将持续到它完成时 错误并发出 COMMIT TRANSACTION 以进行修改 数据库的永久部分,或者遇到错误并且所有 使用 ROLLBACK TRANSACTION 语句删除修改

    BEGIN TRANSACTION 为连接启动本地事务 发表声明。 取决于当前的事务隔离 级别设置,获取许多资源以支持 Transact-SQL 连接发出的语句被事务锁定 直到通过 COMMIT TRANSACTION 或 ROLLBACK 完成 交易声明。长期未完成的交易 时间可以阻止其他用户访问这些锁定的资源, 并且还可以防止日志截断。

    虽然 BEGIN TRANSACTION 启动本地事务,但它不是 记录在事务日志中,直到应用程序随后 执行必须记录在日志中的动作,例如执行 INSERT、UPDATE 或 DELETE 语句。一个应用程序可以执行 获取锁等动作来保护事务隔离 SELECT 语句的级别,但日志中没有记录任何内容,直到 应用程序执行修改操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-08
      • 2019-10-12
      • 2013-06-17
      • 2019-07-11
      • 1970-01-01
      • 2019-02-23
      相关资源
      最近更新 更多