sqlserver死锁问题:事务(进程 ID 113)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。
·
1.死锁定义:
定义:多个事务尝试访问同一资源,导致只有一个事务成功进行(例如更新同一条数据)
示例:事务(进程 ID 58)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。
处理:数据库自动检测死锁,选择回滚代价最小的事务作为牺牲品,自动回滚,无需人工处理。
方案:短事务、规范事务访问顺序、避免同时操作多张表、重试机制
2.复现方式
-- 锁的复现:
-- 建表语法
CREATE TABLE TempSaveData (
Id int IDENTITY(1,1) NOT NULL,
Code varchar(255) COLLATE Chinese_PRC_CI_AS NULL,
[Time] datetime NULL,
Remark varchar(MAX) COLLATE Chinese_PRC_CI_AS NULL,
CONSTRAINT PK__TempSave__3214EC077DB5FFC7 PRIMARY KEY (Id)
);
CREATE NONCLUSTERED INDEX IX_TempSaveData ON dbo.TempSaveData ( Code ASC )
WITH ( PAD_INDEX = OFF ,FILLFACTOR = 100 ,SORT_IN_TEMPDB = OFF , IGNORE_DUP_KEY = OFF , STATISTICS_NORECOMPUTE = OFF , ONLINE = OFF , ALLOW_ROW_LOCKS = ON , ALLOW_PAGE_LOCKS = ON )
ON [PRIMARY ] ;
-- 窗口1
BEGIN TRANSACTION;
UPDATE TempSaveData SET Remark = '窗口1-锁A' WHERE Code = 'A';
UPDATE TempSaveData SET Remark = '窗口1-等B' WHERE Code = 'B';
rollback;
-- 窗口2
BEGIN TRANSACTION;
UPDATE TempSaveData SET Remark = '窗口2-锁B' WHERE Code = 'B';
UPDATE TempSaveData SET Remark = '窗口2-等A' WHERE Code = 'A';
rollback;
3.锁的分类:
锁的说明:
共享锁(S):整个表允许读不允许改
排他锁(X):整个表不允许读改
更新锁(U):表明即将升级成X锁,可避免其余事务升级成X锁导致死锁
意向共享锁(IS):某表某行允许读不允许改
意向排他锁(IX):某表某行不允许读改
模式共享锁(Sch-S):整个表允许读不允许改结构
一般来讲,进行增删改时会加上X/IX锁,意向锁是数据库手动加的
更多推荐




所有评论(0)