【达梦数据库】

达梦数据库

锁表

简单copy过来的,忘记了出处

处理

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的会话中查,是因为那个会话卡主了,什么都做不了。

  1. 通过 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。

达梦数据库锁表与阻塞添加链接描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值