oralce的锁疑问?insert 和update锁疑问!!

[复制链接]
查看11 | 回复9 | 2012-1-4 11:54:26 | 显示全部楼层 |阅读模式
本帖最后由 luck_libiao 于 2014-11-7 11:40 编辑
疑问:
(操作均未提交)在对一个表进行insert的时候,会产生TX lmode=6 TM lmode=3的锁,而update的时候产生的锁是相同的,那么请问为何update的时候,为何不能对整个表进行删除,而插入的时候却可以删除整个表的数据呢?
按照我的理解应该是: lmode=6 所有行排他锁 TM lmode=3 表共享锁 ,也就是表结构不能修改的锁+不能对所有记录进行同时锁
但是insert 和update产生的锁相同,为何锁产生的结果却不同:update不可以对整个表的记录再加排它锁,而insert却可以。
实验记录如下:
create table t (x int);
SCOTT@ORCL>select * from t;
X
----------
1
1
2
1
1
1
1
1
1
已选择10行。
一个session sid=129 ,操作如下:
SCOTT@ORCL>insert into t values('1');---此时并没有提交,查看该session对应的锁信息
已创建 1 行。
SCOTT@ORCL>select m.TYPE,m.LMODE from v$lock m where m.SID='129';
TYLMODE
-- ----------
AE
4
TM
3
TX
6
SCOTT@ORCL>
另外一个session操作删除整个表的记录:
SCOTT@ORCL>select sid from v$mystat where rownumdelete from t;
已删除10行。
SCOTT@ORCL>
---并未产生等待,此时
提交sid=129的insert操作
SCOTT@ORCL>commit;
提交完成。
在sid=129 的session上执行:
SCOTT@ORCL>update t set x='3' where x='2' ;
此时并没有提交
查询129产生的锁如下:
SCOTT@ORCL>select m.TYPE,m.LMODE from v$lock m where m.SID='129';
TYLMODE
-- ----------
AE
4
TM
3
TX
6
在另外一个session中删除表t
SCOTT@ORCL>select sid from v$mystat where rownumdelete from t;
此时产生锁等待,无法查询结果
请各位版主看看,问题的原因在哪里,究竟哪里理解错误了,烦请赐教。
连接到:
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SCOTT@ORCL>select m.TYPE,m.LMODE from v$lock m where m.SID='129';
TYLMODE
-- ----------
AE
4
TM
3
TX
6
SCOTT@ORCL>select sid from v$mystat where rownum
再次查看锁未发生变化



回复

使用道具 举报

千问 | 2012-1-4 11:54:26 | 显示全部楼层
对锁机制不甚了解。dml操作是基于行级锁,insert时对表原有的行不影响,可以增删改。update同理也是,此时对你更新的行产生锁,所以不可以delete该行,也就是delete from t,但可以delete from t where 。
回复

使用道具 举报

千问 | 2012-1-4 11:54:26 | 显示全部楼层
本帖最后由 luck_libiao 于 2014-11-7 14:42 编辑
bizhanjie 发表于 2014-11-7 11:56
对锁机制不甚了解。dml操作是基于行级锁,insert时对表原有的行不影响,可以增删改。update同理也是,此时对 ...

但是insert的时候,已经可以查看到对该表进行的锁:
SCOTT@ORCL>select * from v$locked_object ;
XIDUSNXIDSLOT XIDSQNOBJECT_ID SESSION_ID
---------- ---------- ---------- ---------- ----------
ORACLE_USERNAME
OS_USER_NAME
------------------------------ ------------------------------
PROCESS
LOCKED_MODE
------------------------ -----------
10 2596771272129
SCOTT
CHINA\test13800:13804
3
回复

使用道具 举报

千问 | 2012-1-4 11:54:26 | 显示全部楼层
你原来表有10条数据,再插入1条
insert的时候加的行级锁是针对你INSERT的那行数据加的锁。 原来的10行数据没有行级别的锁。 插入的1行上有行级别的锁。
所以你可以删掉原来的10条数据。
update的时候。你更新的是10行数据中的其中的1行数据。
此时你更新的那1行数据上家了行级别的锁。
你这时候要删除这10行数据,由于10行里面有1行数据上有行级别的锁,所以产生锁等待。
此时,你只可以删除没有加行锁的那其余的9行数据。


回复

使用道具 举报

千问 | 2012-1-4 11:54:26 | 显示全部楼层
ses19828 发表于 2014-11-7 14:22
你原来表有10条数据,再插入1条
insert的时候加的行级锁是针对你INSERT的那行数据加的锁。 原来的10行数据 ...

你的解释,我能够理解,但是就是无法解释v$lock中的锁信息;TX锁,lmode=6应该是所有行的排它锁,为何实际没有生效呢?
回复

使用道具 举报

千问 | 2012-1-4 11:54:26 | 显示全部楼层
luck_libiao 发表于 2014-11-7 14:41
你的解释,我能够理解,但是就是无法解释v$lock中的锁信息;TX锁,lmode=6应该是所有行的排它锁,为何实际 ...

网络给的解释如下:
insert 阻塞
insert操作会对表加3级rx锁,和行排他锁,但是一般不会发生阻塞,因为读一致性的关系,在没提交之前只有当前session才可以操作新插入的行,对于其他事务来说 新增的记录是不可见的。
但是还是有点不太明白。
回复

使用道具 举报

千问 | 2012-1-4 11:54:26 | 显示全部楼层
第1次,没提交,原DELETE操作无关,第2次,数据已经提交,一个在update, 另外一个在delete, 出现数据争夺,当然堵塞,
回复

使用道具 举报

千问 | 2012-1-4 11:54:26 | 显示全部楼层
luck_libiao 发表于 2014-11-7 14:41
你的解释,我能够理解,但是就是无法解释v$lock中的锁信息;TX锁,lmode=6应该是所有行的排它锁,为何实际 ...

tx 是事务锁,, 只是针对插入的数据,并非全表,
回复

使用道具 举报

千问 | 2012-1-4 11:54:26 | 显示全部楼层
本帖最后由 luck_libiao 于 2014-11-7 16:03 编辑
ZALBB 发表于 2014-11-7 14:56
tx 是事务锁,, 只是针对插入的数据,并非全表,

版本,你的解释,我有点明白了:你看是否是这样:lmode=6 即表示行排它锁,即事务排它锁,只针对当前操作的行的排它锁,而不是所有行的排它锁呢。
回复

使用道具 举报

千问 | 2012-1-4 11:54:26 | 显示全部楼层
http://www.oracledatabase12g.com ... racle-row-lock.html
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行