不灭的焱

革命尚未成功,同志仍须努力下载JDK17

作者:Albert.Wen  添加时间:2023-11-03 15:49:52  修改时间:2024-02-25 10:18:47  分类:MySQL/NoSQL  编辑

SQL SERVER 数据库中经常会出现“锁表”的情况

出现该情况得原因一般是:

  1. 字段不加索引:在执行事务的时候,如果表中没有索引,会执行全表扫描,如果这时候有其他的事务过来,就会发生锁表!
  2. 事务处理时间长:事务处理时间较长,当越来越多事务堆积的时候,会发生锁表!
  3. 关联操作太多:涉及到很多张表的修改等,在并发量大的时候,会造成大量表数据被锁!

解决该问题的方法有:

  1. 通过相关的sql语句可以查出是否被锁定,和被锁定的数据
  2. 为加锁进行时间限定,防止无限死锁
  3. 加索引,避免全表扫描
  4. 尽量顺序操作数据
  5. 根据引擎选择合理的锁粒度
  6. 事务中的处理时间尽量短

出现锁表后就需要相应的“解锁”操作

1.查询锁表的进程

SELECT
    request_session_id spid,
    OBJECT_NAME(resource_associated_entity_id) tableName
FROM
    sys.dm_tran_locks
WHERE
    resource_type = 'OBJECT'

2.解锁语句

需要将锁表进程 @spid换成查询出来的锁表进程

declare @spid int
Set @spid = 65 --锁表进程
declare @sql varchar(1000)
set @sql='kill '+cast(@spid as varchar)
exec(@sql)

其实,直接kill即可:

kill  spid值