达梦数据库锁表与阻塞
2021/8/9 19:06:13
本文主要是介绍达梦数据库锁表与阻塞,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1、定义
阻塞:多个线程之间的相互影响,等待临界资源;
死锁:多个线程之间互相等待,形成等待环;
对于死锁,达梦数据库会自动检测,并选择牺牲掉其中的一个事务,保证其它事务正常运行。
select * from V$DEADLOCK_HISTORY;--查询死锁历史
记录了产生死锁后被牺牲掉的事务的事务ID、会话ID、执行的SQL语句以及死锁发生时间(没有记录造成死锁的其它事务)。
对于阻塞,达梦数据库不会自动处理,被阻塞的事务会一直挂起。应尽量形成短事务,快速提交。
1、 什么情况下会形成阻塞?
在达梦数据库中,查询永远不会被阻塞,SELECT FOR UPDATE的情况除外。
INSERT语句被阻塞的情况:多个事务同时向有主键或唯一约束的表中插入相同的数据;
删、改语句被阻塞的情况:所需要操作的数据被其它事务修改过,且一直没有提交或回滚
2、 阻塞的排查
1)环境创建
drop table test;
create table test(id int,name varchar);
insert into test values(1,'test');
commit;
select * from test;
2)执行修改
update test set name='test222' where id=1;
3)执行查询
select * from test where id=1;
4)切换会话查询
select * from test where id=1;
由于之前的修改事务没有提交,所以新会话查出来的结果还是旧的值。
5)在新会话执行删除操作
delete from test where id=1;
此时,发生阻塞,因为 delete 操作需要加锁,当前事务被挂起。
6)在旧会话中查询阻塞的事务
select * from v$trxwait;
事务7400被阻塞了,阻塞他的事务为7401,阻塞了249734毫秒。
之所以不在执行delete的会话中查,是因为那个会话卡主了,什么都做不了。
7) 通过 V$SESSIONS 视图查找两个事务对应的会话
查哪些 SQL 语句产生的阻塞
select sess_id,sql_text,state,trx_id from v$sessions where trx_id in('7400','7401');
4、阻塞的解决方法
根据需求,可以有两种解决方案。
4.1 提交或回滚产生阻塞的事务。
rollback;
commit;
4.2 关闭产生阻塞的会话
使用系统过程 SP_CLOSE_SESSION(SESS_ID)来关闭对应的会话
SP_CLOSE_SESSION(1981579576);
注意:sess_id指的是v$sessions中的sess_id。
更多资讯请上达梦技术社区了解: https://eco.dameng.com
这篇关于达梦数据库锁表与阻塞的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南