查看: 19912|回复: 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 仍然在等待锁,为什么呢?请高手能解释一下,十分感谢
论坛徽章:
0
70#
发表于 2010-4-15 23:53 | 只看该作者
综一句话而言:rollback is abnormal.   commit is normal.
if your session 1 useing :commit.  then session2 and session3 will go on together.

使用道具 举报

回复
论坛徽章:
0
69#
发表于 2010-4-15 23:42 | 只看该作者
insert 是DML语句,操作后不会自动提交,需要人工去干涉的。
session1,给表加锁(X)了。这时session2、session3顺序来进行DML语句操作,session2要得到一个行锁(SX)后才会hang住。session3也一样。当session1 rollback后,session2的锁(SX)〈(X),session2请求x锁,去初如化锁,因为执行的是DML语句,而且现在还有一个session3完后就又请求了sx锁,所以只有session2commit|rollback,session3的语句才有返回信息,但此时session3也是有一个sx锁。直到commit|rollback.


- session1 "lock table T1 in X mode"
- session2 "insert into T1 values..." -> hang since session2 try to acquire a lock SX on T1
- session3 "insert into T1 values..." -> hang since session3 try to acquire a lock SX on T1
- session1 "rollback" -> since rollback can be considered as "ABNORMAL" operation and held mode is X -> we invalidate the enqueue on T1
- session2 get out from wait . Since session2 requested mode is SX < X mode and enqueue on T1 is invalidated -> session2 tries to acquire a X lock to clear invalidation of the resource . This operation succeds, then session2 releases the X lock and acquires again SX lock and succeeds again .
- session3 get out from wait in same time as session2 and trying the same X lock ( to clear invalidation) . With timing window, session3 tries to get a X lock when session2 has finished to get a SX lock .

使用道具 举报

回复
论坛徽章:
19
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:06:13BLOG每日发帖之星
日期:2010-03-28 01:01:02ITPUB9周年纪念徽章
日期:2010-10-08 09:31:222012新春纪念徽章
日期:2012-01-04 11:51:22
68#
发表于 2008-1-22 18:25 | 只看该作者

oracle在好多中资源的abnormal 处理中都是用的这种方法的
怎么高明的方法怎么会之用一次呢
^_^

使用道具 举报

回复
论坛徽章:
19
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:06:13BLOG每日发帖之星
日期:2010-03-28 01:01:02ITPUB9周年纪念徽章
日期:2010-10-08 09:31:222012新春纪念徽章
日期:2012-01-04 11:51:22
67#
发表于 2008-1-21 18:28 | 只看该作者
orcle的惯用手法
一个abnormal的资源
总是由后面的一个来差屁股的

使用道具 举报

回复
论坛徽章:
3
生肖徽章:虎
日期:2007-09-18 15:23:56会员2007贡献徽章
日期:2007-09-26 18:42:10奥运会纪念徽章:皮划艇激流回旋
日期:2008-06-12 17:50:19
66#
发表于 2008-1-21 17:17 | 只看该作者
近水楼台先得月啊

使用道具 举报

回复
招聘 : Java研发
论坛徽章:
9
授权会员
日期:2005-12-23 16:28:18会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44铁扇公主
日期:2007-10-26 16:08:47生肖徽章2007版:鸡
日期:2008-01-02 17:35:532009新春纪念徽章
日期:2009-01-04 14:52:282009日食纪念
日期:2009-07-22 09:30:00祖国60周年纪念徽章
日期:2009-10-09 08:28:00ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28
65#
发表于 2007-12-13 20:31 | 只看该作者
到现在还没有个结果?

使用道具 举报

回复
招聘 : Java研发
论坛徽章:
9
授权会员
日期:2005-12-23 16:28:18会员2007贡献徽章
日期:2007-09-26 18:42:10ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44铁扇公主
日期:2007-10-26 16:08:47生肖徽章2007版:鸡
日期:2008-01-02 17:35:532009新春纪念徽章
日期:2009-01-04 14:52:282009日食纪念
日期:2009-07-22 09:30:00祖国60周年纪念徽章
日期:2009-10-09 08:28:00ITPUB十周年纪念徽章
日期:2011-11-01 16:20:28
64#
发表于 2007-12-12 22:25 | 只看该作者
大家有没有测过表有主键时的情况的,我发现如果表有主键,session1中回滚,则session2和session3可以立即获得锁:
--SESSION1:
SQL> create TABLE test
  2  (
  3    c1 varchar2(1),
  4    c2 varchar2(1)
  5  )
  6  ;

Table created
SQL> alter TABLE test
  2    add constraint PK_TEST primary key (C1);

Table altered

SQL>  lock table test in exclusive mode;

Table(s) locked

SQL> rollback;

Rollback complete

SQL>

--SESSION2:
SQL> insert into test values('1','A');

--SESSION3:
SQL> insert into test values('2','B');

--查询锁:

SQL> SELECT SID, TYPE, ID1, ID2, LMODE, REQUEST FROM v$lock WHERE sid in(532,
  2  510,
  3  506) ORDER BY sid;

       SID TYPE        ID1        ID2      LMODE    REQUEST
---------- ---- ---------- ---------- ---------- ----------
       506 TM     113966          0          0          3
       510 TM     113966          0          0          3
       532 TM     113966          0          6          0
       532 TX     655380     572628          6          0
      
--在SESSION1中rollback:
SQL> rollback;

Rollback complete

SQL>

--查询锁:

SQL> SELECT SID, TYPE, ID1, ID2, LMODE, REQUEST FROM v$lock WHERE sid in(532,
  2  510,
  3  506) ORDER BY sid;

       SID TYPE        ID1        ID2      LMODE    REQUEST
---------- ---- ---------- ---------- ---------- ----------
       506 TM     113966          0          3          0
       506 TX     327701     430279          6          0
       510 TX     458772     415416          6          0
       510 TM     113966          0          3          0

SQL>

这个跟表有没有主键或者唯一约束有关系?

[ 本帖最后由 zhpsam 于 2007-12-12 22:28 编辑 ]

使用道具 举报

回复
论坛徽章:
0
63#
发表于 2007-12-12 12:07 | 只看该作者
原帖由 net pinaster 于 2007-12-11 23:48 发表
插一句。为什么在不同的版本,oracle处理的方式是不一样的呢?oracle是基于什么在9.2.0.x之后做了这样的改变?
如果是象ilonng所说的锁提升的话,是否会引起应用程序潜在的问题呢?



针对这个现象不要把注意力放在这点上面。
从目前的测试来看,前面有人说了只有在9207这个版本下面才不会锁住, 其他的版本都有这种现象。所以应该是9207反而是异常。




针对这个现象,好像是rollback和commit两种情况下锁释放的原理不太一样,才会导致这种现象。

使用道具 举报

回复
论坛徽章:
4
ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44数据库板块每日发贴之星
日期:2007-11-27 01:05:02生肖徽章2007版:兔
日期:2008-02-28 09:45:58生肖徽章2007版:狗
日期:2009-08-25 13:35:11
62#
发表于 2007-12-12 09:50 | 只看该作者
原帖由 Kamus 于 2007-12-12 01:38 发表


是有这个差异,在我的11g中同样是RX TM锁,我没有9i的数据库环境了,如果谁有帮忙测试一下在9i中的现象。

还有另外一个问题

lock table t1 in ROW SHARE MODE; --此时是RS TM锁
select * from t1 for update;  -- 此时锁转换为RX TM,这是正常的

但是下面
lock table t1 in SHARE MODE; --此时是S TM锁
select * from t1 for update;  -- 此时锁转换为SRX TM,实际上没有必要

看文档中的描述也没有说到后一种转换:

Default Locking for INSERT, UPDATE, DELETE, and SELECT ... FOR UPDATE

The locking characteristics of INSERT, UPDATE, DELETE, and SELECT ... FOR UPDATE statements are as follows:

    *      The transaction that contains a DML statement acquires exclusive row locks on the rows modified by the statement. Other transactions cannot update or delete the locked rows until the locking transaction either commits or rolls back.

    *      The transaction that contains a DML statement does not need to acquire row locks on any rows selected by a subquery or an implicit query, such as a query in a WHERE clause. A subquery or implicit query in a DML statement is guaranteed to be consistent as of the start of the query and does not see the effects of the DML statement it is part of.

    *      A query in a transaction can see the changes made by previous DML statements in the same transaction, but cannot see the changes of other transactions begun after its own transaction.

    *      In addition to the necessary exclusive row locks, a transaction that contains a DML statement acquires at least a row exclusive table lock on the table that contains the affected rows. If the containing transaction already holds a share, share row exclusive, or exclusive table lock for that table, the row exclusive table lock is not acquired. If the containing transaction already holds a row share table lock, Oracle automatically converts this lock to a row exclusive table lock.


9i的效果也是RX TM锁:
session 1:
SQL> select distinct sid from v$mystat;

       SID
----------
        37

session 2:
SQL> select * from v$lock where sid=37 and type in ('TM','TX');

no rows selected

session 1:
SQL> select * from t where a=1 for update;

         A
----------
         1

session 2:
SQL> /   

ADDR     KADDR           SID TY        ID1        ID2      LMODE    REQUEST      CTIME      BLOCK
-------- -------- ---------- -- ---------- ---------- ---------- ---------- ---------- ----------
5D867808 5D867914         37 TX    1048582     113027          6          0          3          0
5D725A28 5D725A3C         37 TM      63338          0          3          0          3          0


根据这个文档上所说的,也不奇怪了。
If the containing transaction already holds a share, share rowexclusive, or exclusive table lock for that table, the row exclusivetable lock is not acquired. If the containing transaction already holdsa row share table lock, Oracle automatically converts this lock to arow exclusive table lock。

主要是锁提升的机制和锁转换的机制,我很不清楚,老大能不能解释一下

使用道具 举报

回复

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