Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server锁定机制令人恼火_Sql Server - Fatal编程技术网

Sql server SQL Server锁定机制令人恼火

Sql server SQL Server锁定机制令人恼火,sql-server,Sql Server,在连接到2014 DB的SQLServer 2014 Management Studio中打开2个窗口 在第一个窗口中: SELECT * FROM categorytypes WHERE id = 12 输出: ID DESCRIPTION ORDER --------------------- 12 Electronics 20 然后: 现在转到其他窗口(Ctrl+N): 查询将无限期执行,直到提交或回滚第一个窗口事务。这很好,因为ID=12行被锁定 SELECT * FROM C

在连接到2014 DB的SQLServer 2014 Management Studio中打开2个窗口

在第一个窗口中:

SELECT * FROM categorytypes WHERE id = 12
输出:

ID  DESCRIPTION ORDER
---------------------
12  Electronics 20 
然后:

现在转到其他窗口(Ctrl+N):

查询将无限期执行,直到提交或回滚第一个窗口事务。这很好,因为ID=12行被锁定

SELECT * FROM CategoryTypes WHERE ID <> 12
这就是问题所在,为什么这个查询应该无限期地执行,我们知道ID=12有“Electronics”的描述

在大型应用程序中,在同一个表上同时执行大型DML进程和选择操作,这种锁定机制不允许在不同的记录集上同时执行这两项操作

在Oracle中,只要锁定(脏行)不是结果集的一部分,这种用例就可以工作

伙计们,有没有办法避免这种Oracle锁定机制?我不想使用
NOLOCK
,也不想将我的事务设置为
readuncommitted


谢谢。

在SQL Server中,默认行为是在默认的读取提交隔离级别中使用锁定。对于这种默认的锁定行为,特别重要的是要有有用的索引,以便只触及所需的数据。例如,如果您1)在Description上有一个索引,2)在查询计划中使用该索引来定位所需的行,则不会阻止
WHERE
子句中包含Description的查询。如果描述上没有索引,则将导致完整表扫描,并且当查询遇到未提交的更改时将被阻止

如果要避免锁定,使读卡器不会阻止写入程序,反之亦然,则可以启用“读取提交的快照数据库”选项。SQL Server随后将使用行版本控制而不是锁定,以确保只返回提交的数据


与使用行版本控制的其他DBMS产品一样,读取提交快照比内存锁定的开销更大。SQL Server每行增加14个字节的额外存储空间,并且在行版本存储中更频繁地使用tempdb。这些开销成本是否合理取决于您的工作负载体验所带来的并发好处。

在SQL Server中,默认行为是在默认的读取提交隔离级别中使用锁定。对于这种默认的锁定行为,特别重要的是要有有用的索引,以便只触及所需的数据。例如,如果您1)在Description上有一个索引,2)在查询计划中使用该索引来定位所需的行,则不会阻止
WHERE
子句中包含Description的查询。如果描述上没有索引,则将导致完整表扫描,并且当查询遇到未提交的更改时将被阻止

如果要避免锁定,使读卡器不会阻止写入程序,反之亦然,则可以启用“读取提交的快照数据库”选项。SQL Server随后将使用行版本控制而不是锁定,以确保只返回提交的数据


与使用行版本控制的其他DBMS产品一样,读取提交快照比内存锁定的开销更大。SQL Server每行增加14个字节的额外存储空间,并且在行版本存储中更频繁地使用tempdb。这些开销成本是否合理取决于您的工作负载体验带来的并发好处。

您有机会在这里了解锁。查看sys.dm_tran_locks,查看更新事务持有的锁以及select请求的锁。您可能希望加入sys.dm_tran_session_事务以将其与会话id关联。锁定在行上实际上不起作用。它对索引记录有效。根据您的访问路径,锁可能会冲突或不冲突。您有机会在此处了解有关锁的信息。查看sys.dm_tran_locks,查看更新事务持有的锁以及select请求的锁。您可能希望加入sys.dm_tran_session_事务以将其与会话id关联。锁定在行上实际上不起作用。它对索引记录有效。根据您的访问路径,锁可能会发生冲突,也可能不会发生冲突。
SELECT * FROM CategoryTypes
SELECT * FROM CategoryTypes WHERE ID <> 12
SELECT * FROM CategoryTypes WHERE Description = 'MEN'