Sql server SQL Server锁定机制令人恼火
在连接到2014 DB的SQLServer 2014 Management Studio中打开2个窗口 在第一个窗口中: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
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'