• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

select…for update在mysql和oracle间锁行为的比较_MySQL

mysql 搞代码 4年前 (2022-01-09) 19次浏览 已收录 0个评论

gaodaima.com

select…for update在mysql和oracle间锁行为的比较

环境:

[sql]

mysql> show variables like '%storage_engine%';

+—————-+——–+

| Variable_name | Value |

+—————-+——–+

| storage_engine | InnoDB |

+—————-+——–+

1 row in set (0.00 sec)

mysql> select version();

+———–+

| version() |

+———–+

| 5.1.52 |

+———–+

1 row in set (0.06 sec)

[sql]

SQL> select * from v$version where rownum=1;

BANNER

—————————————————————-

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 – 64bi

SQL> !uname -a

Linux Think 2.6.32-220.el6.x86_64 #1 SMP Wed Nov 9 08:03:13 EST 2011 x86_64 x86_64 x86_64 GNU/Linux

对mysql而言,select for update必须在一个事务中,当事务commit,锁也就释放了。因此,在实验时,务必加个begin、start transaction 或者 set autocommit=0。

mysql:

[sql]

——————sesson_A—————:

mysql> begin;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from t where i=2 for update;

+—+——+

| i | n |

+—+——+

| 2 | b

|

+—+——+

1 row in set (0.00 sec)

——————session_B—————:

mysql> select * from t;

+—+——+

| i | n |

+—+——+

| 2 | b

|

| 3 | c

|

+—+——+

2 rows in set (0.00 sec)

mysql> select * from t where i=2 for update;

被阻塞…

mysql> update t set n='f' where i=2;

被阻塞…

mysql> alter table t drop index t_idx;

被阻塞…

mysql> delete from t where i=2;

被阻塞…

oracle:

[sql]

———————–session_A—————

SQL> select * from t where i=1 for update;

I N

———- ——————–

1 think big

———————–session_B—本文来源gao.dai.ma.com搞@代*码#网————

SQL> select * from t where i=1 for update;

被阻塞…

SQL> update t set n='think open' where i=1;

被阻塞…

SQL> create index t_idx on t(i);

create index t_idx on t(i)

*

ERROR at line 1:

ORA-00054: resource busy and acquire with NOWAIT specified

SQL> delete from t where i=1;

被阻塞…

于mysql,select … for update 对行记录加个X锁。其他任何事务想在这些行上加任何锁都会被阻塞。这也符合InnoDB行级锁的概念。

在oracle中,我们再做下一个测试:

[sql]

———–session_A————-

SQL> select * from t for update;

A

—–

a

————–session_B————-

SQL> select sid,type,lmode from v$lock where sid=159;

SID TY LMODE

———- — ———-

159 TM 3

159 TX 6

对oracle,当发出select … for update的时候、得到的是RX锁(lmode=3),同时通过trc文件,我们还可以发现,Lck被置为1,也也就是同时被加上了行级锁。

trc部分摘录如下:

[sql]

Itl Xid Uba Flag Lck Scn/Fsc

0x01 0x000a.029.0000013b 0x008000dd.00c8.2b C— 0 scn 0x0000.000911f4

0x02 0x0004.026.00000142 0x008000a3.00c7.04 –U- 1 fsc 0x0000.00091339

…..

tl: 5 fb: –H-FL– lb: 0x2 cc: 1

col 0: [ 1] 61

gaodaima.com


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:select…for update在mysql和oracle间锁行为的比较_MySQL

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址