查看: 19857|回复: 69

[体系架构] 请教一个刚遇到的关于lock的问题

[复制链接]
论坛徽章:
4
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44生肖徽章2007版:牛
日期:2008-11-10 09:55:38生肖徽章2007版:猪
日期:2009-02-16 13:39:32生肖徽章2007版:猪
日期:2009-03-11 02:06:58
跳转到指定楼层
1#
发表于 2007-12-6 23:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教一个刚遇到的关于lock的问题。
用sql plus 分别开了三个session,然后对同一个表进行下面的操作:
session 1:
SQL> lock table test.test0001 in exclusive mode;

表已锁定。

session 2:
SQL> insert into test.test0001(lsh) values(1);

session 3:
SQL> insert into test.test0001(lsh) values(2);

然后,释放session 1 的锁
SQL> rollback;

回退已完成。

此时session 2的反应为
SQL> insert into test.test0001(lsh) values(1);

已创建 1 行。

但是session 3 仍然在等待锁,为什么呢?请高手能解释一下,十分感谢
论坛徽章:
33
ITPUB元老
日期:2009-03-11 15:35:03咸鸭蛋
日期:2011-11-06 22:20:25紫蛋头
日期:2011-12-27 22:15:052012新春纪念徽章
日期:2012-01-04 11:49:542014年新春福章
日期:2014-02-18 16:41:11马上有车
日期:2014-02-18 16:41:11红宝石
日期:2014-06-03 13:13:19
2#
发表于 2007-12-6 23:34 | 只看该作者
是这样的:
当session 1执行lock table test.test0001 in exclusive mode;  这样对test0001加了一个TM锁,阻塞了session 2和session3对test0001的操作。同时session2和session3都会在test0001上加TM锁。
当session 1执行roll时释放TM锁时,按照先后顺序,session2便完成了insert 操作,同时在test0001上面加了TM和TX锁,这样肯定阻塞session3对test0001的操作

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
5
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44生肖徽章2007版:鼠
日期:2008-01-02 17:35:532010新春纪念徽章
日期:2010-03-01 11:19:54灰彻蛋
日期:2012-06-13 18:48:14双黄蛋
日期:2012-06-14 14:32:02
3#
发表于 2007-12-6 23:52 | 只看该作者
不对吧,session1释放了tm锁,session2和session3不就相当于两条普通insert语句了吗,为啥会session2诸塞session3?

使用道具 举报

回复
论坛徽章:
11
授权会员
日期:2007-07-08 18:54:592009日食纪念
日期:2009-07-22 09:30:00生肖徽章2007版:蛇
日期:2008-10-24 16:46:51奥运会纪念徽章:现代五项
日期:2008-10-24 13:26:49生肖徽章2007版:羊
日期:2008-04-17 18:05:112008新春纪念徽章
日期:2008-02-13 12:43:03生肖徽章2007版:鼠
日期:2008-01-02 17:35:53生肖徽章2007版:鸡
日期:2008-01-02 17:35:53ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44会员2007贡献徽章
日期:2007-09-26 18:42:10
4#
发表于 2007-12-7 00:58 | 只看该作者
session1,session 2中加了tm的排他锁

使用道具 举报

回复
论坛徽章:
28
ITPUB元老
日期:2005-06-17 10:37:44操作系统板块每日发贴之星
日期:2005-07-02 01:01:58数据库板块每日发贴之星
日期:2005-07-18 01:01:26管理团队2006纪念徽章
日期:2006-04-16 22:44:45会员2006贡献徽章
日期:2006-04-17 13:46:34
5#
发表于 2007-12-7 01:00 | 只看该作者
give us ddl of the table including all indexes and constraints

使用道具 举报

回复
论坛徽章:
11
授权会员
日期:2007-07-08 18:54:592009日食纪念
日期:2009-07-22 09:30:00生肖徽章2007版:蛇
日期:2008-10-24 16:46:51奥运会纪念徽章:现代五项
日期:2008-10-24 13:26:49生肖徽章2007版:羊
日期:2008-04-17 18:05:112008新春纪念徽章
日期:2008-02-13 12:43:03生肖徽章2007版:鼠
日期:2008-01-02 17:35:53生肖徽章2007版:鸡
日期:2008-01-02 17:35:53ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44会员2007贡献徽章
日期:2007-09-26 18:42:10
6#
发表于 2007-12-7 01:01 | 只看该作者
原帖由 dhcwenOra 于 2007-12-6 23:52 发表
不对吧,session1释放了tm锁,session2和session3不就相当于两条普通insert语句了吗,为啥会session2诸塞session3?



不是的。如果按你说的话,其实在session2中加的是tm的row排他锁。

[ 本帖最后由 stronghearted 于 2007-12-7 01:02 编辑 ]

使用道具 举报

回复
论坛徽章:
314
行业板块每日发贴之星
日期:2012-07-12 18:47:29双黄蛋
日期:2011-08-12 17:31:04咸鸭蛋
日期:2011-08-18 15:13:51迷宫蛋
日期:2011-08-18 16:58:25紫蛋头
日期:2011-08-31 10:57:28ITPUB十周年纪念徽章
日期:2011-09-27 16:30:47蜘蛛蛋
日期:2011-10-20 15:51:25迷宫蛋
日期:2011-10-29 11:12:59ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41鲜花蛋
日期:2011-11-09 20:33:30
7#
发表于 2007-12-7 08:29 | 只看该作者
原帖由 stronghearted 于 2007-12-7 00:58 发表
session1,session 2中加了tm的排他锁


SESSION2 插入纪录而已,怎么会用排他锁?

应该是该表有唯一性索引造成的。

使用道具 举报

回复
论坛徽章:
4
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44生肖徽章2007版:牛
日期:2008-11-10 09:55:38生肖徽章2007版:猪
日期:2009-02-16 13:39:32生肖徽章2007版:猪
日期:2009-03-11 02:06:58
8#
 楼主| 发表于 2007-12-7 08:50 | 只看该作者
表 test.test0001 没有任何索引和约束。我现在没法拿到ddl,环境在家里呢...
数据库版本是10.2。

使用道具 举报

回复
论坛徽章:
314
行业板块每日发贴之星
日期:2012-07-12 18:47:29双黄蛋
日期:2011-08-12 17:31:04咸鸭蛋
日期:2011-08-18 15:13:51迷宫蛋
日期:2011-08-18 16:58:25紫蛋头
日期:2011-08-31 10:57:28ITPUB十周年纪念徽章
日期:2011-09-27 16:30:47蜘蛛蛋
日期:2011-10-20 15:51:25迷宫蛋
日期:2011-10-29 11:12:59ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41鲜花蛋
日期:2011-11-09 20:33:30
9#
发表于 2007-12-7 10:15 | 只看该作者
作了测试,SESSION 1 没解锁之前,2,3都申请 tm=3  的锁,1 解锁后,
2 获得 tm=3,但 3 要  tm=6, 结果被堵,奇怪,3 为什么要  tm=6 的锁?

[php]
SCOTT@bi>select b.* from (select id1,id2 from v$lock where block=1) a, v$lock b
  2  where a.id1=b.id1 and a.id2=b.id2 order by b.id1,b.id2,b.ctime;

ADDR             KADDR              SID TY        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK
---------------- ---------------- ----- -- ---------- ---------- ---------- ---------- ---------- ----------
00000000B68DAD80 00000000B68DADA8   108 TM    1232201          0          0          3         27          0
00000000B68DAC80 00000000B68DACA8   148 TM    1232201          0          0          3         30          0
00000000B68DAB80 00000000B68DABA8    20 TM    1232201          0          6          0         39          1


SCOTT@bi>select b.* from (select id1,id2 from v$lock where block=1) a, v$lock b
  2  where a.id1=b.id1 and a.id2=b.id2 order by b.id1,b.id2,b.block;

ADDR             KADDR              SID TY        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK
---------------- ---------------- ----- -- ---------- ---------- ---------- ---------- ---------- ----------
00000000B68DAD80 00000000B68DADA8   108 TM    1232201          0          0          6         75          0
00000000B68DAB80 00000000B68DABA8   148 TM    1232201          0          3          0         75          1

[/php]

使用道具 举报

回复
论坛徽章:
0
10#
发表于 2007-12-7 10:23 | 只看该作者
是挺怪的

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表