为什么 SQL 语句不起作用?交易如何运作?
Why SQL statement doesn't work? How do transactions work?
问题表达:
我正在尝试一些关于交易的事情。考虑以下操作:
- 在 SQL Server Management Studio
中打开一个连接 window 1
BEGIN
一个事务,然后从table一个 中删除大约2000行数据
- 在 SQL Server Management Studio
中打开另一个连接 window 2
- 向 table A in window 2 中插入一行新数据(无事务),运行现在成功了
然后,我重复同样的操作,但是在STEP 2我删除了10k行数据,那么STEP 4就无法运行成功。我已经等了半个小时了。
显示正在执行SQL...无法完成。最后,我使用连接 window 1 插入数据,现在可以正常工作了。
为什么它适用于 2k 行而不是 10k 行?
我执行的Sql句:
连接windowsA,我执行
开始交易
从 tableA(10K 行)
中删除
连接windows B,我执行
插入 tableA(..) VALUES (...)
windowsB无法执行成功
非常感谢@Gordon
原因:
我搜索关于锁升级的关键字。
我尝试使用 SQL Server Profiler 跟踪锁升级,我得到了一个
lock:escalation 当我在事务中删除很多数据时(我不提交或回滚)。
所以,我知道了锁升级的概念。
我在 table 中删除了太多数据,然后行锁升级到 table escalation.I 没有提交或回滚它们,其他连接(或应用程序)
无法使用 table 锁访问 table。
trace lock escalation in sql profiler
MSSQL服务器发生锁升级时
"The locks option also affects when lock escalation occurs. When locks is set to 0, lock escalation occurs when the memory used by the current lock structures reaches 40 percent of the Database Engine memory pool. When locks is not set to 0, lock escalation occurs when the number of locks reaches 40 percent of the value specified for locks."
如何使用 SQL Server Management Studio 设置会影响锁升级:
配置锁选项
在对象资源管理器中,右键单击服务器和 select 属性。
单击“高级”节点。
在 Parallelism 下,为锁选项键入所需的值。
使用锁选项设置可用锁的最大数量,这样可以限制服务器使用的内存量SQL。
您遇到的是"lock escalation"。默认情况下,SQL 服务器使用(我认为)行级锁进行删除。但是,如果表达式超过某个阈值——5,000 个锁——然后 SQL 服务器将锁定升级到整个 table.
这是一种自动机制,您可以根据需要将其关闭。
在SQL 服务器文档和相关文档中都有很多关于此的信息。
问题表达:
我正在尝试一些关于交易的事情。考虑以下操作:
- 在 SQL Server Management Studio 中打开一个连接 window 1
BEGIN
一个事务,然后从table一个 中删除大约2000行数据
- 在 SQL Server Management Studio 中打开另一个连接 window 2
- 向 table A in window 2 中插入一行新数据(无事务),运行现在成功了
然后,我重复同样的操作,但是在STEP 2我删除了10k行数据,那么STEP 4就无法运行成功。我已经等了半个小时了。
显示正在执行SQL...无法完成。最后,我使用连接 window 1 插入数据,现在可以正常工作了。
为什么它适用于 2k 行而不是 10k 行?
我执行的Sql句:
连接windowsA,我执行 开始交易 从 tableA(10K 行)
中删除连接windows B,我执行 插入 tableA(..) VALUES (...)
windowsB无法执行成功
非常感谢@Gordon
原因:
我搜索关于锁升级的关键字。 我尝试使用 SQL Server Profiler 跟踪锁升级,我得到了一个 lock:escalation 当我在事务中删除很多数据时(我不提交或回滚)。
所以,我知道了锁升级的概念。 我在 table 中删除了太多数据,然后行锁升级到 table escalation.I 没有提交或回滚它们,其他连接(或应用程序) 无法使用 table 锁访问 table。 trace lock escalation in sql profiler
MSSQL服务器发生锁升级时
"The locks option also affects when lock escalation occurs. When locks is set to 0, lock escalation occurs when the memory used by the current lock structures reaches 40 percent of the Database Engine memory pool. When locks is not set to 0, lock escalation occurs when the number of locks reaches 40 percent of the value specified for locks."
如何使用 SQL Server Management Studio 设置会影响锁升级:
配置锁选项 在对象资源管理器中,右键单击服务器和 select 属性。
单击“高级”节点。
在 Parallelism 下,为锁选项键入所需的值。
使用锁选项设置可用锁的最大数量,这样可以限制服务器使用的内存量SQL。
您遇到的是"lock escalation"。默认情况下,SQL 服务器使用(我认为)行级锁进行删除。但是,如果表达式超过某个阈值——5,000 个锁——然后 SQL 服务器将锁定升级到整个 table.
这是一种自动机制,您可以根据需要将其关闭。
在SQL 服务器文档和相关文档中都有很多关于此的信息。