数据库死锁

一个session上的数据修改没有提交,数据库会保持锁的状态,在业务中一般出现的死锁可能由于修改数据库过程中通信中断,而修改的数据没有及时提交。在书上看到数据库被锁定可以使用commit或rollback进行锁的释放,但是实际运维时处理的方式应该是kill掉锁的进程,一方面是防止业务混乱,另一方面是不同的session里看到的数据状态不一样。
在数据提交之前,当前session可以看到修改后的状态,但是其他session查询数据是从回滚段里取数据。
以下对于死锁的解决为借鉴,借鉴哪里忘记了…
1.查看死锁
SQL> select s.username, l.object_id, l.session_id,s.serial#, s.lockwait, s.status, s.machine, s.program from v$session s, v$locked_object l where s.sid = l.session_id;
字段说明:
Username:死锁语句所用的数据库用户;
SID: session identifier, session 标示符,session 是通信双方从开始通信到通信结束期间的一个上下文。
SERIAL#: sid 会重用,但是同一个sid被重用时,serial#会增加,不会重复。
Lockwait:可以通过这个字段查询出当前正在等待的锁的相关信息。
Status:用来判断session状态。Active:正执行SQL语句。Inactive:等待操作。Killed:被标注为删除。
Machine: 死锁语句所在的机器。
Program: 产生死锁的语句主要来自哪个应用程序。
2.查看引起死锁的语句
SQL> select sql_text from v$sql where hash_value in (select sql_hash_value from v$session where sid in (select session_id from v$locked_object));
3.处理死锁
SQL> alter system kill session ‘SID,SERIAL#’;
最后,说明一下session的status分为几种:
(1)active:处于此状态的会话,表示正在执行,处于活动状态。
(2)inactive:处于此状态的会话表示不是正在执行的。
(3)killed处于此状态的会话,被标注为删除,表示出现了错误,正在回滚。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值