达梦数据库锁的概述及查询与解决

锁的概述

    1)锁是一种机制,多个事务同时访问一个数据库对象时,该机制可以实现对并发的控制
    2)达梦数据库中锁的类别
         ddl锁:自动的施加和释放
         dml锁:事务开始时施加,使用Commit或者Rollback释放
    3)死锁: 当两个用户希望持有对方的资源时就会发生死锁。即两个用户互相等待对方释放资源,oracle认定为产生了死锁,在这种情况下,将以牺牲一个用户作为代价,另一个用户继续执行,牺牲的用户的事务将回滚。

锁的查看

 SELECT * FROM V$SESSION;--查看会话和锁的信息
 SELECT * FROM V$SESSION_WAIT;--查看等待的会话信息
 SELECT * FROM V$LOCK;--系统中所有锁
 SELECT * FROM V$LOCKED_OBJECT;--系统中DML锁  

测试

 新建两个测试表,插入数据提交
 create table lock1 (id number,name varchar(50));
 insert into lock1 values(1,'aaaa');
 insert into lock1 values(2,'bbbb');
 create table lock2 (id number,name varchar(50));
 insert into lock2 values(1,'ssss');
 insert into lock2 values(3,'dddd');
 commit;
 执行下面更新语句,不要提交
 update lock1 set name='sss' where id=1;
 update lock2 set name='ss' where id=1;

 打开新窗口,执行如下:

  打开另一个新窗口,执行如下:

  根据V$SQL_HISTORY可以查看想要的历史记录

  通过v$lock视图查到当前数据库中锁的状态,如下可看到有两个事务114326,114327 被事务 114320所阻塞

 根据V$sessions 和v$lock 查询产生阻塞的事务会话
 select s.sess_id,s.SQL_TEXT,s.RUN_STATUS from v$sessions s , v$lock l where   l.tid=s.trx_Id and l.blocked=1;


解决办法

   1 如上所示查询出产生阻塞的事务会话id,只需要在该会话下提交或回滚事务,锁自然会被释 放,阻塞解决
    2 使用系统过程SP_CLOSE_SESSION(SESS_ID)来关闭对应的会话
    select 'SP_CLOSE_SESSION(' ||s.sess_id||')' from v$sessions s,v$lock l where s.trx_id=l.tid and l.blocked=1;

  执行会话之后,可以看到被阻塞的会话已经成功执行
  SP_CLOSE_SESSION(2516820264)

锁预防和总结

   1.经常提交以避免长时间锁定行。
   2.避免使用LOCK命令锁定表。
   3.另外需注意,需监测系统中死锁,调查为什么这些锁正被保持,频率;当死锁发生通过回滚事务rollback或者终止会话来解决它。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值