【发布时间】:2020-02-03 15:14:05
【问题描述】:
问题表达:
我正在尝试一些关于交易的事情。考虑以下操作:
- 在 SQL Server Management Studio 中打开连接窗口 1
-
BEGIN一个事务,然后从A表中删除大约2000行数据 - 在 SQL Server Management Studio 中打开另一个连接窗口 2
- 在窗口 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