我使用的是 SQL Server 2012 Express Edition,请问如何查看数据库中记录的所有锁定/块进程?我想查看以前锁定/阻塞的进程的原因是SQL Server只允许我们查看数据库中当前锁定的进程。
我发现我的 SQLException 日志文件中几乎没有超时错误,所以我想知道是否有一种方法可以查看或查询导致超时的锁/块的过去记录。
我没有打开数据库 TT 的阻止进程报告
我已经通读了 MySQL 参考手册的几个部分,虽然它反复声明LOCK TABLES不能在存储过程中使用,但我从未找到其背后推理的解释。
尝试运行以下查询以创建新数据库时:
CREATE DATABASE [Lunch]
CONTAINMENT = NONE
ON PRIMARY
( NAME = N'Lunch',
FILENAME = N'E:\Data Files\Lunch.mdf' ,
SIZE = 110592KB , FILEGROWTH = 1048576KB ),
FILEGROUP [DATA]
( NAME = N'Lunch_Data',
FILENAME = N'E:\Data Files\Lunch_Data.ndf' ,
SIZE = 110592KB , FILEGROWTH = 1048576KB ),
FILEGROUP [NONCLUSTERED_INDEXES]
( NAME = N'Lunch_nonclusteredindexes',
FILENAME = N'E:\Data Files\Lunch_nonclusteredindexes.ndf' ,
SIZE = 110592KB , FILEGROWTH = 1048576KB )
LOG ON
( NAME = N'Lunch_log',
FILENAME = N'F:\logFiles\Lunch_log.ldf' ,
SIZE = 524288KB ,
FILEGROWTH = …Run Code Online (Sandbox Code Playgroud) 我对 SQL Server 中的锁定的理解是,如果一个进程在索引中的资源 ega 键行上持有排它 (X) 锁,则另一个进程无法获取同一资源上的共享 (S) 锁,必须等待它被发布。
我一直在尝试演示一个修复程序,用于解决访问同一个表的 2 个不同存储过程之间的死锁,一个使用显式事务来包装一个 SELECT 然后一个 DELETE,另一个只执行 SELECT 而没有显式事务. 这些都发生在 READ COMMITTED 事务隔离级别下。
我完成了在 2 个 SSMS 查询窗口中模拟每个过程的步骤,并查询 sys.dm_tran_locks 以查看每个步骤后持有和等待的锁。
我希望有人解释为什么,尽管有时我确实会遇到预期的死锁,但并非总是如此,而且我可以看到 X 锁已被授予一个连接,而我仍然可以从另一个连接中进行选择。
该演示是人为的,以及在非聚簇索引上拆分 SELECT 的原因,以获取聚簇键值,其中 SELECT 使用聚簇键从聚簇索引中读取其他列(并将两个选择包装在显式事务中HOLDLOCK 在第一个)是模拟我的真实世界查询的实际查询计划,它在非聚集索引上寻找并在聚集索引上执行键查找。我需要展示当读写连接上的 DELETE 查询与只读连接上的 SELECT 冲突时会发生什么
测试数据库不允许 SNAPSHOT ISOLATION 或 READ COMMITTED SNAPSHOT,并且两个连接都已显式设置为 READ COMMITTED 事务隔离级别,因此应该需要共享锁来读取行。
我已经在我的本地机器上使用 SQL2017 CU9(在 64 位 Windows 10 Enterprise build 16299 上)、在带有 SQL2017 CU7 的服务器上(在 Windows Server 2016 Standard build 14393 上)以及带有 SQL2016 sp1-CU2(在 Windows Server 上)的服务器上进行了测试2012 R2 标准版本 …
MYSQL VERSION : 5.7.X
STORAGE ENGINE : Innodb
Run Code Online (Sandbox Code Playgroud)
我有一个大致的想法,即 Read Committed Isolation 将主要使用 Shared and Exclusive Record Locks。但是,根据 mysql docs,在某些情况下,甚至 Read Committed 也必须使用间隙锁定。
READ COMMITTED ..... 对于锁定读取(SELECT with FOR UPDATE 或 LOCK IN SHARE MODE)、UPDATE 语句和 DELETE 语句,InnoDB 只锁定索引记录,而不锁定它们之前的间隙,因此允许自由插入新记录在锁定的记录旁边。间隙锁定仅用于外键约束检查和重复键检查。
恕我直言,只有记录锁就足够了。谁能解释一下 Gap 锁定的场景以及为什么 mysql 会这样做?
我已经阅读了许多关于 NOLOCK 或读取未提交的隔离级别在采用的锁/闩锁方面如何运作的不同看法。
当使用带有 NOLOCK 的 SELECT 或在 Read Uncommitted Isolation 级别时,是唯一取出模式稳定性锁的锁,还是在查询通过行时滚动获取共享锁?(显然这些锁需要立即放下)
闩锁呢?当我假设不允许引用正在修改的内存对象时,如何处理内存中的页面?
我在我的系统上捕获了一个死锁,(匿名)XML 输出如下:
<deadlock>
<victim-list>
<victimProcess id="processf4d9233468" />
</victim-list>
<process-list>
<process id="processf4d9233468" taskpriority="0" logused="0" waitresource="KEY: 6:72057594039631872 (d117f90e375f)" waittime="481" ownerId="840005340" transactionname="SELECT" lasttranstarted="2019-10-14T10:16:07.550" XDES="0xeec803db90" lockMode="S" schedulerid="16" kpid="7220" status="suspended" spid="145" sbid="0" ecid="0" priority="0" trancount="0" lastbatchstarted="2019-10-14T10:16:07.547" lastbatchcompleted="2019-10-14T10:16:07.550" lastattention="1900-01-01T00:00:00.550" clientapp=".Net SqlClient Data Provider" hostname="MYWEBSERVER" hostpid="4512" loginname="MyOtherLogin" isolationlevel="read committed (2)" xactid="840005340" currentdb="6" currentdbname="MyDB" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
<executionStack>
<frame procname="MyDB.MySchema.MyProc" line="13" stmtstart="670" stmtend="9106" sqlhandle="MYSQLHANDLE">
SELECT p.[Col25]
, p.Col1
, pId.Col2
, p.Col3
, p.Col4
, p.Col5
, CONVERT(VARCHAR(10),p.Col6,103)
, a.[Col7]
, a.[Col8]
, a.[Col9]
, a.[Col10]
, a.[Col11] …Run Code Online (Sandbox Code Playgroud) (前一个问题是:将多个列设置为非空时,Postgres 会使用多列索引吗?)
通常,当我将列设置为非空时,如果它没有索引,那么我首先添加它,以便 postgres 可以(希望)在锁定表的同时进行表扫描时使用索引,以便表被锁定在较短的时间内。
我想设置几列不为空,如下所示:
alter table foos
alter column bar1 set not null
alter column bar2 set not null
alter column bar3 set not null
alter column bar4 set not null;
Run Code Online (Sandbox Code Playgroud)
如果我为这些列创建了多列索引,那么在进行此更改之前,postgres 会在扫描锁定表时使用它吗?
CREATE INDEX CONCURRENTLY my_index on foos (bar1, bar2, bar3, bar4);
Run Code Online (Sandbox Code Playgroud)
如果我在 IS NULL(或 IS NOT NULL)上建立了部分索引怎么办
CREATE INDEX CONCURRENTLY my_index on foos (bar1, bar2, bar3, bar4) where bar1 is null and bar2 is null and bar3 is null and bar4 is null;
Run Code Online (Sandbox Code Playgroud) 我试图理解为什么在某些情况下锁定计数sys.dm_tran_locks和sqlserver.lock_acquired扩展事件存在差异。这是我的重现脚本,我StackOverflow2013在 SQL Server 2019 RTM 上使用数据库,兼容性级别为 150。
/* Initial Setup */
IF OBJECT_ID('dbo.HighQuestionScores', 'U') IS NOT NULL
DROP TABLE dbo.HighQuestionScores;
CREATE TABLE dbo.HighQuestionScores
(
Id INT PRIMARY KEY CLUSTERED,
DisplayName NVARCHAR(40) NOT NULL,
Reputation BIGINT NOT NULL,
Score BIGINT
)
INSERT dbo.HighQuestionScores
(Id, DisplayName, Reputation, Score)
SELECT u.Id,
u.DisplayName,
u.Reputation,
NULL
FROM dbo.Users AS u;
CREATE INDEX ix_HighQuestionScores_Reputation ON dbo.HighQuestionScores (Reputation);
Run Code Online (Sandbox Code Playgroud)
接下来我用一个大的假行数更新表统计信息
/* Chaotic Evil. */
UPDATE STATISTICS dbo.HighQuestionScores WITH ROWCOUNT = 99999999999999;
DBCC …Run Code Online (Sandbox Code Playgroud) 我知道并发创建索引时,只需要一个SHARE ShareUpdateExclusiveLock 锁。
但是,在进程一开始的一小段时间内是否需要更严格类型的锁定?或者整个操作只需要一个SHARE ShareUpdateExclusiveLock 锁?
我这么问是因为我想知道在同时创建索引时设置什么类型的超时是有利的。
locking ×10
sql-server ×5
index ×2
mysql ×2
postgresql ×2
alter-table ×1
blocking ×1
deadlock ×1
innodb ×1
latch ×1
null ×1
transaction ×1