数据库锁表,指在数据库里,同一个数据可能有多个人来读取或更改,为了防止更改的时候别人也同时更改,所以要锁住表防止别人更改。
简单来说,锁表主要发生在以下几种情况:
- 锁表主要发生在
insert
、update
、delete
中; - 在执行上面语句时,没有执行
commite
、回滚或退出数据库用户时,在另一进程执行上述语句会进入资源正忙的异常(即卡死),此时已锁表; - 多个更改语句一起执行,而不是顺序执行时回锁表;
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
[Linux]关于grep、awk、sed命令
对于一些文件字段或文件名等截取或重命名等操作,我们一般会用到正则等方法实现,Linux中的grep、awk、s […]
[SQL]ORACLE中SQLLDR关于空格的问题
关于Oracle中使用SQLLDR有时候会出现关于空格保留或去除的问题,就这个问题的解决方案有不少,但如果是由 […]