您的位置:首页 > 数据库 > Oracle

Oracle LOCK内部机制及最佳实践系列(三)构想一个使用手工锁定解决一种业务需求的场景

2012-11-28 23:28 597 查看
自己构想一个使用手工锁定解决一种业务需求的场景,并给出SQL演示。

场景:手工锁定一个表,例如 我们在做一个秘密交易的时候,谈好的价格就不能变了,必须一手交钱一手交货完成交易,为了保证价格安全,我们先把价格表锁定,这期间不允许篡改,保证完成交易

LEO1@LEO1> lock table t1 in share mode; 手工锁定一个表,设置锁的级别为4

Table(s) Locked.

LEO1@LEO1> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM','TX') order by 1,2;

SID TYPE ID1 ID2 LMODE REQUEST BLOCK

---------- ---------- ---------- ---------- ---------- ---------- ----------

138 TM 73449 0 4 0 0 已经在T1表上加上了4号锁,除了当前会话外阻塞其他会话进行修改

LEO2@LEO1> insert into leo1.t1 values(5); 我们在会话leo2上插入一条记录,此时hang住了不动了

LEO1@LEO1> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM','TX') order by 1,2;

SID TYPE ID1 ID2 LMODE REQUEST BLOCK

---------- ---------- ---------- ---------- ---------- ---------- ----------

138 TM 73449 0 4 0 1

156 TM 73449 0 0 3 0

这就是由于我们加了4号锁除了当前会话外阻塞156会话进行修改,156会话默认可以获得一个3号锁,由于3号和4号互斥不能共存,所以没有获得锁,正在等待申请3号锁

LEO1@LEO1> commit; 锁跟着事务的结束而释放,commit rollback都行

LEO1@LEO1> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM','TX') order by 1,2; 此时没有锁信息了

no rows selected

[b]Leonarding[/b]

2012.11.28

天津&winter

分享技术~成就梦想

Blog:www.leonarding.com
本文出自 “刘盛分享技术~成就梦想” 博客,请务必保留此出处http://leonarding.blog.51cto.com/6045525/1073549
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐