【问题标题】:Why SQL statement doesn't work? How do transactions work?为什么 SQL 语句不起作用?交易如何运作?
【发布时间】:2020-02-03 15:14:05
【问题描述】:

问题表达:

我正在尝试一些关于交易的事情。考虑以下操作:

  1. 在 SQL Server Management Studio 中打开连接窗口 1
  2. BEGIN一个事务,然后从A表中删除大约2000行数据
  3. 在 SQL Server Management Studio 中打开另一个连接窗口 2
  4. 在窗口 2 的表 A 中插入一行新数据(无事务),现在运行成功

然后,我重复同样的操作,但是在 STEP 2 中我删除了 10k 行数据,在这种情况下,STEP 4 无法成功运行。我已经等了半个小时了。

它表明它正在执行SQL...无法完成。最后,我使用连接窗口 1 插入数据,它现在可以工作了。

为什么它适用于 2k 行而不适用于 10k 行?


我执行的Sql语句:

在连接窗口 A 中,我执行 开始传输 从 tableA 中删除(10K 行)

在连接窗口 B 中,我执行 插入到 tableA(..) VALUES (...)

windows B 无法成功执行。


非常感谢@Gordon

原因

我搜索了关于锁升级的关键字。 我尝试使用 SQL Server Profiler 跟踪锁升级,我得到一个 锁定:当我删除事务中的许多数据时升级(我不提交或回滚)。

所以,我知道锁升级的概念。 我删除了表中的太多数据,然后行锁定升级到表升级。我没有提交或回滚它们,其他连接(或应用程序) 无法访问带有表锁的表。 trace lock escalation in sql profiler


在 MSSQL Server 中发生锁升级时

“locks 选项也会影响何时发生锁升级。当 locks 设置为 0 时,当当前锁结构使用的内存达到数据库引擎内存池的 40% 时,会发生锁升级。当 locks 未设置为 0 ,当锁的数量达到为锁指定的值的 40% 时,就会发生锁升级。"


如何设置使用 SQL Server Management Studio 会影响锁升级:

配置锁定选项 在对象资源管理器中,右键单击服务器并选择属性。

单击“高级”节点。

在 Parallelism 下,为 locks 选项输入所需的值。

使用 locks 选项设置可用锁的最大数量,例如限制 SQL Server 为其使用的内存量。

【问题讨论】:

  • COMMIT/ROLLBACK交易了吗?你SET TRANSACTION ISOLATION LEVEL了吗?你在用TABLE Hints吗?
  • @Sami 不,我没有。
  • 粘贴您正在使用的代码而不是概述流程通常是个好主意。通常,有人说他们在做什么和他们的代码实际做什么是两件不同的事情。

标签: sql sql-server transactions locking


【解决方案1】:

您遇到的是“锁升级”。默认情况下,SQL Server 使用(我认为)行级锁进行删除。但是,如果表达式具有超过某个阈值(5,000 个锁),则 SQL Server 会将锁定升级到整个表。

这是一种自动机制,您可以根据需要将其关闭。

在 SQL Server 文档和相关文档中都有很多关于此的信息。

【讨论】:

  • 非常感谢!我知道我在事务期间删除了太多数据,他们做了太多行锁,行锁的数量消耗了我数据库上 40% 的内存。结果,锁升级发生了。最后,我做不到桌子上的任何操作。再次感谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-17
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多