郭一军,网名guoyJoe,尖峰在线培训创始人、Oracle OCM、ITPUB论坛Oracle认证版版主、2013最佳精华贴、Senior DBA、Oracle OCT、 ACOUG MEMBER、CSDN 认证专家、RHCE、在线技术分享的倡导者和实践者。 http://www.jianfengedu.com http://jianfengedu.taobao.com
全部博文(72)
2014年(72)
分类: Oracle
2014-06-19 10:37:42
转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/12021587
正确答案:ABE
这道题需要我们了解锁的知识点。
TM锁的模式:
0-None --没有锁 select
1-Null --空锁
2-SS(RS) --行级共享锁(Row Shared,简称RS锁)
通过lock table t10 in row sharemode;命令添加RS锁
3-SX(RX) --行级排他锁(Row exclusive)RX锁
进行DML时,会自动在被更新的表上添加RX锁,可以执行LOCK命令显式的在表上添加RX锁
允许其他事务通过DML语句修改相同表里的其他数据行
允许使用lock table t10 in row exclusive mode;命令对表添加RX锁定;
不允许其他事务对表添加X锁
通过select … from for update命令添加RX锁
4-S --共享锁(Share,简称S锁)
通过lock table t10 in share mode;命令添加该S锁(wait for ITL release)
5-SSX(SRX) --共享行级排他锁(Share Row Exclusive,简称SRX锁)
通过lock table t10 in share rowexclusive mode;命令添加SRX锁
6-X --排他锁(Exclusive,简称X锁)
通过lock table t10 in exclusive mode命令添加X锁
根据题意,我们开起一个会话执行以上的for update的语句会产生一个3号锁(在9i是号锁,10g及以上版本是3号锁)和6号锁。操作如下,观察锁。
1丶在125号会话下,执行select语句
gyj@OCM> select sid from v$mystat where rownum=1; SID ---------- 125 gyj@OCM> SELECT ename 2 FROM emp 3 WHERE job=\'CLERK\' FOR UPDATE OF empno; ENAME ---------- SMITH ADAMS JAMES MILLER
2丶查125会话的锁信息
gyj@OCM> select * from v$lock where sid=125; ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK ---------------- ---------------- ---------- -- ---------- ---------- ---------- ---------- ---------- ---------- 00000000910D8F58 00000000910D8FB0 125 TO 68064 1 3 0 273 0 00000000910D91F8 00000000910D9250 125 AE 100 0 4 0 993 0 00002B18F6AFC2E0 00002B18F6AFC340 125 TM 77522 0 3 0 145 0 000000008FB4E7E0 000000008FB4E858 125 TX 196640 1474 6 0 105 0
发现TM的3号锁,TX的6号锁。
OK,我们对答案一一解析:
答案A正确,会被阻塞。开另一个会话:22号会话,执行如下:
gyj@OCM> select sid from v$mystat where rownum=1; SID ---------- 22 gyj@OCM> LOCK TABLE emp IN SHARE MODE;
被阻塞了,LOCK TABLE emp IN SHARE MODE;会产生4号锁
gyj@OCM> select * from v$lock where sid in(125,22); ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK ---------------- ---------------- ---------- -- ---------- ---------- ---------- ---------- ---------- ---------- 00000000910D8F58 00000000910D8FB0 125 TO 68064 1 3 0 557 0 00000000910D91F8 00000000910D9250 125 AE 100 0 4 0 1277 0 00000000910DA0F0 00000000910DA148 22 AE 100 0 4 0 304 0 00002B18F6AFD318 00002B18F6AFD378 22 TM 77522 0 0 4 107 0 00002B18F6AFD318 00002B18F6AFD378 125 TM 77522 0 3 0 429 1 000000008FB4E7E0 000000008FB4E858 125 TX 196640 1474 6 0 389 0
答案B正确,会被阻塞。开另一个会话:17号会话,执行如下:
gyj@OCM> select sid from v$mystat where rownum=1; SID ---------- 17 gyj@OCM> LOCK TABLE emp IN EXCLUSIVE MODE;
被阻塞了,LOCK TABLE emp IN EXCLUSIVE MODE;会产生6号锁
gyj@OCM> select * from v$lock where sid in(125,17); ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK ---------------- ---------------- ---------- -- ---------- ---------- ---------- ---------- ---------- ---------- 00000000910D8F58 00000000910D8FB0 125 TO 68064 1 3 0 726 0 00000000910D91F8 00000000910D9250 125 AE 100 0 4 0 1446 0 00000000910D99F0 00000000910D9A48 17 AE 100 0 4 0 91 0 00002B18F6AFC2E0 00002B18F6AFC340 17 TM 77522 0 0 6 70 0 00002B18F6AFC2E0 00002B18F6AFC340 125 TM 77522 0 3 0 598 1 000000008FB4E7E0 000000008FB4E858 125 TX 196640 1474 6 0 558 0
答案C不正确,不会被阻塞。开一另会话148号会话,操作如下:
gyj@OCM> select sid from v$mystat where rownum=1; SID ---------- 148 gyj@OCM> UPDATE emp SET sal=sal*1.2 WHERE job=\'MANAGER\'; 3 rows updated.
没有被阻塞,可以更新,在同一个表中更新不同的行,锁不会有冲突。
gyj@OCM> select * from v$lock where sid in(125,148); ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK ---------------- ---------------- ---------- -- ---------- ---------- ---------- ---------- ---------- ---------- 00000000910D8F58 00000000910D8FB0 125 TO 68064 1 3 0 1684 0 00000000910D91F8 00000000910D9250 125 AE 100 0 4 0 2404 0 00000000910D92D8 00000000910D9330 148 AE 100 0 4 0 265 0 00002B18F6AFC2E0 00002B18F6AFC340 148 TM 77522 0 3 0 108 0 00002B18F6AFC2E0 00002B18F6AFC340 125 TM 77522 0 3 0 121 0 000000008FB01218 000000008FB01290 148 TX 327685 1488 6 0 65 0 000000008FB4E7E0 000000008FB4E858 125 TX 131082 1475 6 0 121 0
答案D不正确,不会被阻塞。与答案C一样的情况,这里就不再说了。
答案E正确,会被阻塞。开另一会话 143号会话,执行如下
gyj@OCM> select sid from v$mystat where rownum=1; SID ---------- 143 gyj@OCM> SELECT ename FROM emp WHERE job=\'CLERK\' FOR UPDATE OF empno;
被阻塞了,更新同一行,会有行锁的冲突。
gyj@OCM> select * from v$lock where sid in(125,143); ADDR KADDR SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK ---------------- ---------------- ---------- -- ---------- ---------- ---------- ---------- ---------- ---------- 00000000910D8F58 00000000910D8FB0 125 TO 68064 1 3 0 2019 0 00000000910D91F8 00000000910D9250 125 AE 100 0 4 0 2739 0 00000000910D98F8 00000000910D9950 143 TX 131082 1475 0 6 82 0 00000000910D9D70 00000000910D9DC8 143 AE 100 0 4 0 114 0 00002B18F6AFD318 00002B18F6AFD378 125 TM 77522 0 3 0 456 0 00002B18F6AFD318 00002B18F6AFD378 143 TM 77522 0 3 0 82 0 000000008FB4E7E0 000000008FB4E858 125 TX 131082 1475 6 0 456 1
锁的机制中有一个非常重要的概念:锁的兼容性,看下面这幅图:
QQ:252803295
技术交流QQ群:
DSI&Core Search Ⅰ 群:127149411(2000人技术群:未满)
DSI&Core Search Ⅱ 群:177089463(1000人技术群:未满)
DSI&Core Search Ⅲ 群:284596437(500人技术群:未满)
DSI&Core Search Ⅳ 群:192136702(500人技术群:未满)
DSI&Core Search Ⅴ 群:285030382(500人闲聊群:未满)
MAIL:dbathink@hotmail.com
BLOG: http://blog.csdn.net/guoyjoe
WEIBO:
ITPUB: http://www.itpub.net/space-uid-28460966.html
OCM: