1 - SET IMPLICT_TRANSACTIONS 通常为 OFF,除非您将 ANSI_DEFAULTS 设置为 ON。然后它将打开。因此,如果不需要,您可以删除这个额外的语句。
2 - 我同意亚伦。读取未提交(无锁)应与 SELECT 语句一起使用。但是,这可能会导致无效的结果。它容易丢失数据、两次读取数据或扫描错误。
Read Committed Snap Shot Isolation (RCSI) 是一个更好的选择,但会牺牲 tempdb(版本存储空间)。这将使您的报告(读者)不会被交易(作者)阻止。
3 - 设置,SET TRANSACTION ISOLATION LEVEL SERIALIZABLE,将使用最多数量的锁。因此,增加阻塞的机会。
为什么将这种低并发隔离级别与两个 INSERT 语句一起使用?
我可以理解使用这个级别来更新多个表。例如,银行交易。借记一行,贷记另一行。两张桌子。在交易完成之前,没有人可以访问记录。
简而言之,我会为插入语句使用 READ COMMITTED 隔离级别。插入的数据很可能是不同的。
然而,整个画面并不在这里。
正在发生某种类型的阻塞。你需要找到根本原因。
这是查看锁和被锁定对象的代码片段。
--
-- Locked object details
--
-- Old school technique
EXEC sp_lock
GO
-- Lock details
SELECT
resource_type, resource_associated_entity_id,
request_status, request_mode,request_session_id,
resource_description
FROM sys.dm_tran_locks
WHERE resource_database_id = DB_ID('AdventureWorks2012')
GO
-- Page/Key details
SELECT object_name(object_id) as object_nm, *
FROM sys.partitions
WHERE hobt_id = 72057594047037440
GO
-- Object details
SELECT object_name(1266103551)
GO
如果您仍然需要帮助,请识别两个阻塞事务和锁。请张贴此信息。