【锁机制】锁堵塞

模式锁堵塞

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.再打开另一个窗口DSYS用户登录,查看索的堵塞状态

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锁定了4446两个会话,

现在只要把38这个会话kill掉,4446其中一个会话就会被解锁。(到底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锁定了,此时再killB的会话,或者是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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值