模式锁堵塞
1、 首先模拟业务数据创建表并插入数据
HR@ORA11GR2>create table lock_t as select * from employees;
Table created.
2、有三个窗口,按先后顺序A先执行,B后执行,最后C执行同样的一条记录。
A:
19:55:13 HR@ORA11GR2>update lock_t set salary=5000 where employee_id=191;
1 row updated.(未提交)
B:
19:55:38 HR@ORA11GR2>update lock_t set salary=5000 where employee_id=191;
(未提交)
C:记住时间19:55:41
由上可以看出是由A没有结束事务,堵塞了后续的用户操作。
3.再打开另一个窗口D,以SYS用户登录,查看索的堵塞状态
SYS@ORA11GR2>select sid,serial#,username,blocking_session from v$session where username like 'HR';
SID SERIAL# USERNAME BLOCKING_SESSION
---------- ---------- ------------------------------ ----------------
38 3483 HR
44 4143 HR 38
46 2073 HR 38
Blocking_session为锁定其它用户的会话,也就是38锁定了44和46两个会话,
现在只要把38这个会话kill掉,44和46其中一个会话就会被解锁。(到底46,44两个会话哪个先执行,则遵循自动排队,频繁度)
Kill session:语句alter system kill session 'sid,serial#' immediate;
SYS@ORA11GR2>alter system kill session '38,3483' immediate;
System altered.
此时再次查看B窗口:已经更新成功,从原来的等待变成了1 row update.
如下:
19:55:38 HR@ORA11GR2>update lock_t set salary=5000 where employee_id=191;
1 row updated.
同时查看C窗口:依然处于等待状态,是因为B抢先拿到了A释放的锁,然后由于B没有释放,所以C就被B锁定了,此时再kill掉B的会话,或者是B会话结束事务,C就可以拿到锁正常操作。
4、为了让C可以拿到锁,把B会话强制kill掉
1)先查看当前锁的堵塞状态
SYS@ORA11GR2>select sid,serial#,username,blocking_session from v$session where username like 'HR';
SID SERIAL# USERNAME BLOCKING_SESSION
---------- ---------- ------------------------------ ----------------
44 4143 HR 46
46 2073 HR
如上是46锁着44,所以需要把46 kill掉!
2)执行Kill 语句
SYS@ORA11GR2>alter system kill session '46,2073' immediate;
System altered.
3)查看B(刚才被杀掉),并再重新执行sql会提示会话报错的信息,因为刚才此会话已经被删除:
B:再执行刚才的更新语句
20:08:15 HR@ORA11GR2>update lock_t set salary=5000 where employee_id=191;
ERROR:
ORA-03114: not connected to ORACLE
update lock_t set salary=5000 where employee_id=191
*
ERROR at line 1:
ORA-03135: connection lost contact
Process ID: 30674
Session ID: 46 Serial number: 2073
20:16:15 HR@ORA11GR2>
4)查看C:
19:55:41 HR@ORA11GR2>update lock_t set salary=5000 where employee_id=191;
1 row updated.
从刚才的光标闪烁等待变成了更新成功的记录。
死锁:当两个用户希望持有对方的资源时就会发生死锁. 即两个用户互相等待对方释放资源时,oracle认定为产生了死锁,在这种情况下,将以牺牲一个用户作为代价,另一个用户继续执行,牺牲的用户的事务将回滚.
锁堵塞:阻塞是由于资源不足引起的排队等待现象,是多个用户针对某个表的同一行进行DML操作,解决要么等待用户提交,要么杀掉会话;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31397003/viewspace-2126926/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/31397003/viewspace-2126926/