【数据库】锁表原因及处理

文章目录

  • 什么是数据库锁表?
  • 数据库锁表可能会导致什么问题?
  • 死锁问题的原因分析
  • 如何避免数据库锁表?
  • 解决死锁问题的常用策略
  • 解决死锁问题
    • mysql锁表处理
    • ORACEL数据库锁表处理
    • SQL Server数据库锁表处理
  • 来源

什么是数据库锁表?

答:数据库锁表是指在数据库中,为了保证数据的一致性和完整性,可能会对数据进行加锁,以避免并发操作引起的数据冲突。如果锁定的范围过大或时间过长,可能会导致数据库表被锁定,从而影响系统性能。

数据库锁表可能会导致什么问题?

数据库锁表可能会导致系统性能下降、用户体验不佳、系统崩溃等问题。当数据库表被锁定时,其他用户的查询和操作可能会受到影响,从而导致系统运行缓慢甚至崩溃。

死锁问题的原因分析

事务执行顺序:当多个事务按不同的顺序请求和释放资源时,可能会产生死锁的可能性,这是因为事务的执行顺序无法保证一致性。

例如事务的执行时间过长、事务的锁定范围过大、索引使用不当、SQL语句优化不足等。当出现大量并发操作时,出现竞争资源:当多个事务同时请求和持有相同的资源,如行级锁,表级锁等,可能会导致死锁问题的发生。

如何避免数据库锁表?

  • 减少事务的时间
  • 减少事务的范围
  • 合理使用索引
  • 优化SQL语句
  • 分布式事务

解决死锁问题的常用策略

  • 死锁检测和处理:MySQL提供了死锁检测机制,可以通过设置参数innodb_deadlock_detect来启用,当检测到死锁时,可以选择回滚某些事务以解除死锁。但这种方法不能完全避免死锁的发生,而且会增加系统的开销。
  • 加锁顺序:通过约定事务对资源的访问顺序,使得所有事务按相同的顺序请求锁定,可以避免死锁的发生。然而,这种方法需要根据具体的业务需求和数据访问模式来设计,且不适用于复杂的场景。
  • 降低事务隔离级别:将事务的隔离级别降低至READ
    COMMITTED,可以减少死锁的机会。但这也会导致数据一致性的问题,需要在业务层做相应的处理。
  • 超时机制:对于长时间持有锁资源的事务,可以设置超时时间,在超时后自动回滚事务,以避免死锁的发生。这种方法需要谨慎设置超时时间,避免正常事务被错误回滚。
  • 优化SQL语句
  • 优化表结构和索引
  • 分库分表
  • 引入缓存等技术

解决死锁问题

mysql锁表处理

查看进程id,然后用kill id杀掉进程
processlist展示了对应的数据库有哪些线程在运行,如果有些语句执行速度慢,可以在里面看到

show processlist;

根据不同的账号权限可以看到所有用户的,当前用户的对应的连接。只有100条

show full processlist:

展示所有的连接数据

SELECT * FROM information_schema.PROCESSLIST;

查询正在执行的进程

SELECT * FROM information_schema.PROCESSLIST where length(info) >0 ;

字段说明

ID 连接标识符,这个ID和show processlist 中ID是一样的,也和Performance Schema 中threads表的PROCESSLIST_ID 栏位是一样的,也和CONNECTION_ID()函数返回的是一样的
USER 连接的用户,其中system user代表系统用户,非用户连接,unauthenticated user代表是用户连接,但是未完成认证,event_scheduler 用户代表的是监控定时任务的用户
HOST 连接的主机名,如果用户是system user,则HOST为空
DB 连接的数据库,如果未选择数据库,则为NULL
COMMAND 线程执行的命令类型
TIME 线程在当前状态持续的时间,以秒为单位
STATE 线程当前的状态,如果该状态持续很久,说明有问题,如果是SHOW PROCESSLIST 命令,则状态为NULL
INFO 线程执行的具体命令,如果执行的是call procedure,这里可能显示的是内容的语句,如select

查询是否锁表

show OPEN  TABLES where In_use > 0;

字段说明
Database 含有该表的数据库。
Table 表名称。
In_use 表当前被查询使用的次数。如果该数为零,则表是打开的,但是当前没有被使用。
Name_locked 表名称是否被锁定。名称锁定用于取消表或对表进行重命名等操作

查看被锁住的

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;

innodb_locks提供有关InnoDB 事务已请求但尚未获取的每个锁的信息,以及事务持有的阻止另一个事务的每个锁。

字段说明
lock_id:锁 ID。
lock_trx_id:拥有锁的事务 ID。可以和 INNODB_TRX 表 JOIN 得到事务的详细信息。
lock_mode:锁的模式。有如下锁类型:行级锁包括:S、X、IS、IX,分别代表:共享锁、排它锁、意向共享锁、意向排它锁。表级锁包括:S_GAP、X_GAP、IS_GAP、IX_GAP 和 AUTO_INC,分别代表共享间隙锁、排它间隙锁、意向共享间隙锁、意向排它间隙锁和自动递增锁。
lock_type:锁的类型。RECORD 代表行级锁,TABLE 代表表级锁。
lock_table:被锁定的或者包含锁定记录的表的名称。
lock_index:当 LOCK_TYPE=’RECORD’ 时,表示索引的名称;否则为 NULL。
lock_space:当 LOCK_TYPE=’RECORD’ 时,表示锁定行的表空间 ID;否则为 NULL。
lock_page:当 LOCK_TYPE=’RECORD’ 时,表示锁定行的页号;否则为 NULL。
lock_rec:当 LOCK_TYPE=’RECORD’ 时,表示一堆页面中锁定行的数量,亦即被锁定的记录号;否则为 NULL。
lock_data:当 LOCK_TYPE=’RECORD’ 时,表示锁定行的主键;否则为NULL。

等待锁定

SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;

innodb_lock_waits包含每个被阻止InnoDB 事务的一个或多个行,指示它已请求的锁以及阻止该请求的任何锁。

字段说明
requesting_trx_id:请求事务的 ID。
requested_lock_id:事务所等待的锁定的 ID。可以和 INNODB_LOCKS 表 JOIN。
blocking_trx_id:阻塞事务的 ID。
blocking_lock_id:某一事务的锁的 ID,该事务阻塞了另一事务的运行。可以和 INNODB_LOCKS 表 JOIN
杀掉锁表进程
kill 5601

ORACEL数据库锁表处理

第一步:通过管理员权限用户查询被锁表信息
如果怀疑表被锁了,或者事务未被正常关闭,在Oracle数据库中我们可以通过以下语句进行查询获取相关信息:

 select t2.username,    t2.sid,    t2.serial#,    t3.object_name,  t2.OSUSER,  t2.MACHINE,
        t2.PROGRAM,  t2.LOGON_TIME,  t2.COMMAND,   t2.LOCKWAIT,
        t2.SADDR,   t2.PADDR, t2.TADDR,   t2.SQL_ADDRESS,   t1.LOCKED_MODE
   from v$locked_object t1, v$session t2, dba_objects t3
  where t1.session_id = t2.sid
    and t1.object_id = t3.object_id
  order by t2.logon_time;

大家发现,上面这条SQL语句用到了Oracle的两个视图和一个表,分别是v$locked_objectv$sessiondba_objects

v$locked_object视图中记录了所有session中的所有被锁定的对象信息。 v locked_object 视图中记录了所有session中的所有被锁定的对象信息。v$session视图记录了所有session的相关信息。
dba_objects为oracle用户对象及系统对象的集合,通过关联这张表能够获取被锁定对象的详细信息。

eg:现在我通过scott用户执行DML语句(eg:select * from emp for update;或者update scott.emp set sal = ‘2000’ where empno=‘7788’; )之后一直不进行提交,然后通过system用户执行上面的查询oracle中被锁表的sql语句,就会找到如下记录:

说明:

username:oracle用户名
sid:进程号
serial#:序列号
object_name:表名
osuser:操作系统用户名
machine:机器名
program:操作工具
logon_time:登陆时间
lockwait:表示当前这张表是否正在等待其他用户解锁这张表
locked_mode:锁表模式(下面详细说明)

注意:这时候如果通过system用户执行select * from scott.emp for update;语句就无法成功执行。

第二步:通过拥有管理员权限的用户解除数据库中被锁住的表(SID,SERIAL)
通过第一步查出来的信息找到被锁的表之后执行如下语句解锁该表:

alter system kill session ‘sid,seial#’;

注意:sid和seial#就是第一步中查询出来的进程号和序列号。

eg:解除第一步中表的锁

alter system kill session10,15;

现在通过system再次执行DML语句(eg:select * from scott.emp for update;或update scott.emp set sal = ‘2000’ where empno=‘7788’;)就可以了。

锁的模式
v$locked_object中的LOCKED_MODE字段表示锁的模式,oracle中锁的模式有如下几种:

0:none
1null2Row-S 行共享(RS):共享表锁,sub share
3Row-X 行独占(RX):用于行的修改,sub exclusive
4Share 共享锁(S):阻止其他DML操作,share
5:S/Row-X 共享行独占(SRX):阻止其他事务操作,share/sub exclusive
6:exclusive 独占(X):独立访问使用,exclusive

数字越大锁级别越高, 影响的操作越多。

1级锁有: Select,有时会在v$locked_object出现。
2级锁有: Select for update,Lock For Update,Lock Row Share
select for update当对话使用for update子串打开一个游标时,所有返回集中的数据行都将处于行级(Row-X)独占式锁定,其他对象只能查询这些数据行,不能进行update、delete或select for update操作。
3级锁有: Insert, Update, Delete, Lock Row Exclusive
没有commit之前插入同样的一条记录会没有反应, 因为后一个3的锁会一直等待上一个3的锁, 我们必须释放掉上一个才能继续工作。
4级锁有: Create Index, Lock Share
locked_mode为2,3,4不影响DML(insert,delete,update,select)操作, 但DDL(alter,drop等)操作会提示ora-00054错误。
00054, 00000, “resource busy and acquire with NOWAIT specified”
// *Cause: Resource interested is busy.
// *Action: Retry if necessary.
5级锁有: Lock Share Row Exclusive
具体来讲有主外键约束时update / delete … ; 可能会产生4,5的锁。
6级锁有: Alter table, Drop table, Drop Index, Truncate table, Lock Exclusive

还有一条比较实用的sql:

查某session 正在执行的sql语句,从而可以快速定位到哪些操作或者代码导致事务一直进行没有结束等.

 SELECT /*+ ORDERED */ 
  sql_text
   FROM v$sqltext a
  WHERE (a.hash_value, a.address) IN
        (SELECT DECODE(sql_hash_value, 0, prev_hash_value, sql_hash_value),
                DECODE(sql_hash_value, 0, prev_sql_addr, sql_address)
           FROM v$session b
          WHERE b.sid = '67')  /* 此处67 为SID*/
  ORDER BY piece ASC;

SQL Server数据库锁表处理

第一步:查询死锁语句

select dbid,* from sys.sysprocesses
where 1=1
and spid >50
and blocked <> 0
--and spid= 62

查询结果如下图所示:
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/c10d69308de54e4bb772fb23d5f1a31e.png
以上查询得出:

受影响的数据库ID 是 5;
受到阻塞的会话有1301、1306、869、109;
阻塞会话是961;

第二步:查询发生阻塞或死锁的当前数据库
1:通过第一步查询,知道数据库ID 为 DBID=5。

2:sp_helpdb 或 Select name,dbid from master.sys.sysdatabases 查询数据库名称

在这里插入图片描述
第三步:查询发生阻塞或死锁的SQL语句
输出死锁的执行的语句:

dbcc inputbuffer(961)

语句如下:

select o.tp_Login,o.tp_Title, CONVERT(varchar(10),a.TimeCreated,120)  as accessingdate,count(*) as docnum, 'sps' as type  from UserData u,AllDocs a, userinfo o ,webs w where a.ListId = u.tp_ListId and a.Id = u.tp_docID  and w.Id = a.WebId and w.SiteId = a.SiteId and w.SiteId = o.tp_SiteID and

第四步:杀死锁

kill  961

之后再从第一步进行查询,看是否还存在死锁;

从第二步、第三步,查询出了出问题的锁死数据库及SQL语句,便于分析彻底解决死锁问题。

来源

MySQL事务中遇到死锁问题该如何解决?
数据库锁表和解锁
数据库锁表

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/512531.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode热题100】124.二叉树的最大路径和(二叉树)

一.题目要求 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根节点 root …

百度行驶证C++离线SDK V1.1 C#接入

百度行驶证C离线SDK V1.1 C#接入 目录 说明 效果 项目 代码 说明 自己根据SDK封装了动态库&#xff0c;然后C#调用。 SDK包结构 效果 项目 代码 using Newtonsoft.Json; using System; using System.Drawing; using System.Runtime.InteropServices; using System.Text;…

Python基础之pandas:文件读取与数据处理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、文件读取1.以pd.read_csv()为例&#xff1a;2.数据查看 二、数据离散化、排序1.pd.cut()离散化&#xff0c;以按范围加标签为例2. pd.qcut()实现离散化3.排序4.…

走进《与凤行》感受维达棉韧联名魅力

随着《与凤行》的热播&#xff0c;维达也陆续推出了各个纸抽系列的联名&#xff0c;棉韧联名就是这样一款结合了维达品牌优质棉韧面巾纸和《与凤行》IP元素的产品。这款软抽不仅在质地上保持了维达棉韧系列的柔软舒适&#xff0c;还融入了《与凤行》的设计元素&#xff0c;为用…

L2-036 网红点打卡攻略 ( 模拟题 )

本题链接&#xff1a;PTA | 程序设计类实验辅助教学平台 题目&#xff1a; 样例&#xff1a; 输入 6 13 0 5 2 6 2 2 6 0 1 3 4 2 1 5 2 2 5 1 3 1 1 4 1 2 1 6 1 6 3 2 1 2 1 4 5 3 2 0 2 7 6 5 1 4 3 6 2 6 5 2 1 6 3 4 8 6 2 1 6 3 4 5 2 3 2 1 5 6 6 1 3 4 5 2 7 6 2 1 3…

ubuntu20.04 运行 lio-sam 流程记录

ubuntu20.04 运行 lio-sam 一、安装和编译1.1、安装 ROS11.2、安装 gtsam1.3、安装依赖1.4、下载源码1.5、修改文件1.6、编译和运行 二、官方数据集的运行2.1、casual_walk_2.bag2.2、outdoor.bag、west.bag2.3、park.bag 三、一些比较好的参考链接 记录流程&#xff0c;方便自…

管理项目有哪些好用的系统?

不论在公司是什么角色&#xff0c;不过不管是负责哪一块&#xff0c;项目型公司的管理难点都会经历过&#xff0c;特别是中小型的做建筑装饰类的业务。 一般都会存在合同进度统计难、项目成本管控难、上下游结算难等问题&#xff0c;除了资金方面的原因&#xff0c;也有数据核…

c++对象指针

对象指针在使用之前必须先进行初始化。可以让它指向一个已定义的对象&#xff0c;也可以用new运算符动态建立堆对象。 定义对象指针的格式为&#xff1a; 类名 *对象指针 &对象; //或者 类名 *对象指针 new 类名(参数); 用对象指针访问对象数据成员的格式为&#xff1a…

ubuntu16.04不能在主机和虚拟机之间拷贝文本

问题 ubuntu16.04不能在主机和虚拟机之间拷贝文本。 原因 vmware tools没安装好。 解决办法 让虚拟机加载C:\Program Files (x86)\VMware\VMware Workstation\linux.iso光盘文件&#xff0c;设置如下&#xff1a; 拷贝虚拟机光盘中的VMwareTools-10.3.22-15902021.tar.gz文…

点旋转 与 坐标系旋转

之前想明白过&#xff0c;隔了一段时间没看&#xff0c;现在又忘记了。重新复习一下。 这篇博客写的很明白 推公式的话从坐标旋转开始推&#xff0c;容易理解&#xff0c;又容易推导。 1、坐标系中点的旋转的旋转矩阵 xrcos(αβ) r(cosαcosβ-sinαsinβ) xcosβ-ysinβ…

虹科Pico汽车示波器 | 免拆诊断案例 | 2019款别克GL8豪华商务车前照灯水平调节故障

一、故障现象 一辆2019款别克GL8豪华商务车&#xff0c;搭载LTG发动机&#xff0c;累计行驶里程约为10.7万km。车主反映&#xff0c;车辆行驶过程中组合仪表提示前照灯水平调节故障。 二、故障诊断 接车后试车&#xff0c;起动发动机&#xff0c;组合仪表上提示“前照灯水平…

线上剧本杀小程序开发,剧本杀行业的发展趋势

剧本杀一时火爆全网&#xff0c;剧本杀门店也是迅速占领了大街小巷&#xff0c;成为年轻人热衷的游戏娱乐方式。 不过&#xff0c;线下剧本杀因为价格高、剧本质量不过关等问题&#xff0c;迎来了“寒冬期”&#xff0c;线下剧本杀门店的发展逐渐“降温”。 随着互联网的发展…

跨平台内容策略:Kompas.ai让你的内容在各大平台上发光发热

在数字化营销的今天&#xff0c;品牌需要在多个社交媒体平台上建立强大的在线存在。每个平台都有其独特的用户群体和内容消费习惯&#xff0c;这就要求品牌制定精准的跨平台内容策略&#xff0c;以确保在不同的社交环境中都能发光发热。本文将深入探讨不同社交媒体平台的特点及…

一次性邮箱API发送邮件的步骤?如何使用?

一次性邮箱API发送邮件的注意事项&#xff1f;怎么确保安全发信&#xff1f; 使用一次性邮箱API发送邮件&#xff0c;不仅能保证邮件发送的高效性&#xff0c;还能确保用户邮箱信息的安全性。下面&#xff0c;AokSend将详细介绍使用一次性邮箱API发送邮件的具体步骤。 一次性…

ngAlain下使用nz-select与文件上传框出现灵异bug

bug描述 初始化页面&#xff0c;文件上传框无法出现&#xff1a; 但点击一次选择框以后&#xff0c;就会出现&#xff1a; 真的很神奇。。。 下面逐步排查看看是什么原因。 设想一&#xff1a; 选择框与文件框不可同时存在&#xff0c;删掉选择框看看&#xff1a; 还…

【OpenCV】 基础入门(一)初识 Mat 类 | 通过 Mat 类显示图像

&#x1f680; 个人简介&#xff1a;CSDN「博客新星」TOP 10 &#xff0c; C/C 领域新星创作者&#x1f49f; 作 者&#xff1a;锡兰_CC ❣️&#x1f4dd; 专 栏&#xff1a;【OpenCV • c】计算机视觉&#x1f308; 若有帮助&#xff0c;还请关注➕点赞➕收藏&#xff…

Windows11 使用WSL安装虚拟机

Windows11 使用WSL安装Unbuntu 安装Unbuntu 使用管理员命令打开powershell&#xff0c;执行如下命令&#xff0c;默认安装Unbuntu最新版本 wsl --install使用如下命令&#xff0c;获取在线的所有版本 wsl --list --online指定版本安装 wsl --install <Name>默认安装…

操作系统:动静态库

目录 1.动静态库 1.1.如何制作一个库 1.2.静态库的使用和管理 1.3.安装和使用库 1.4.动态库 1.4.1.动态库的实现 1.4.2.动态库与静态库的区别 1.4.3.共享动态库给系统的方法 2.动态链接 2.1.操作系统层面的动态链接 1.动静态库 静态库&#xff08;.a&#xff09;&…

Rust---复合数据类型之元组

目录 元组的使用输出结果 元组的使用 fn main() {// 创建一个元组let my_tuple : (i32, &str, f64) (10, "hello", 3.14);// 打印元组中的元素println!("{:?}", my_tuple);// 访问元组中的元素let first_element my_tuple.0; // 访问第一个元素let…

openldap(一):简介和安装

目录 1 OpenLDAP简介1.1 LDAP介绍1、什么LDAP2、为什么要使用LDAP3、LDAP 的特点4、LDAP常用关键字5、LDAP的objectClass6、LADP使用场景 1.2 OpenLDAP介绍1、什么OpenLDAP2、OpenLDAP特点3、OpenLDAP的组件 2 OpenLDAP安装3 简单使用3.1 创建用户1、创建ou2、创建Group 3、创建…