数据库锁表,指在数据库里,同一个数据可能有多个人来读取或更改,为了防止更改的时候别人也同时更改,所以要锁住表防止别人更改。

简单来说,锁表主要发生在以下几种情况:

  1. 锁表主要发生在insertupdatedelete中;
  2. 在执行上面语句时,没有执行commite、回滚或退出数据库用户时,在另一进程执行上述语句会进入资源正忙的异常(即卡死),此时已锁表;
  3. 多个更改语句一起执行,而不是顺序执行时回锁表;
  4. insert等超多个语句一直执行,而不commite,会发生锁表。

以上情况只是简单的锁表情况,还有很多复杂的情况就不一一列举出来。如果出现insert等SQL语句执行时,长时间无反应甚至卡死状态,很有可能发生了锁表。

Oracle锁表解决

查看当前系统锁表情况

select * from v$locked_object a,v$session b 
where a.session_id = b.sid;

得到的数据库中所有DML语句(指对数据库中表记录的操作)产生的所锁,包括行锁和表锁。解决死锁主要是要表中的 sid、serial# 两个字段。

-- sid 和 serial# 是上面sql语句得到的数值
alter system kill session 'sid,serial#';

MySQL锁表解决

查锁表的进程

SHOW PROCESSLIST;

找到锁表的那个进程的 Id,然后杀掉被锁的表

-- ID 即被锁进程的ID值
KILL ID;

本文由 小TiD笔记 发布在小TiD笔记,转载此文请保持文章完整性,并请附上文章来源(小TiD笔记)及本页链接。

原文链接: https://www.tidnotes.ga/2020/02/sql-unlock.html