国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

DML操作update和delete時產生的鎖示例

2024-07-21 02:42:28
字體:
來源:轉載
供稿:網友
測試對象:在執行dml操作時都產生哪些鎖,elete和update時產生的鎖以及并發刪除一個表時鎖產生的鎖。

測試環境:Oracle10201

具體示例如下:

1、會話1:首先需要找到此會話的sid

SQL> set time on

set PRompt s1

14:46:02 s1> select sid from v$mystat where rownum<=1;

SID

----------

324

2、會話2: 然后找到此會話的sid

SQL> set time on

set prompt s2

14:46:12 s2> select sid from v$mystat where rownum<=1;

SID

----------

315

3、會話3:查看會話1和會話2的鎖情況,此時因為沒有做任何dml操作所以沒有鎖

SQL> set time on

set prompt s3

14:46:17 s3> select * from v$lock where sid in(324,315);

ADDR KADDR SID TYPE ID1 ID2 LMODE REQUEST CTIME BLOCK

-------- -------- ---------- ---- ---------- ---------- ---------- ---------- ---------- ----------

4、會話1對a表刪除1條數據

14:46:35 s1> delete from a where id=2;

1 row deleted

5、查看此時的鎖情況

14:46:55 s3> select * from v$lock where sid in(324,315);

ADDR KADDR SID TYPE ID1 ID2 LMODE REQUEST CTIME BLOCK

-------- -------- ---------- ---- ---------- ---------- ---------- ---------- ---------- ----------

81B57F70 81B57F88 324 TM 195954 0 3 0 6 0

81C32F9C 81C330B8 324 TX 655366 308433 6 0 6 0

6、會話2對a表執行刪除操作,但不刪除任何行

14:46:44 s2> delete from a where id=3;

0 rows deleted

7、查看此時的鎖情況,結果發現雖然會話2沒有刪除任何行,但是仍然產生了一個TX鎖和TM鎖,估計以后的版本中Oracle會對此進行優化,在滿足通用的情況下通常會有一些特例。

14:48:20 s3> select * from v$lock where sid in(324,315);

ADDR KADDR SID TYPE ID1 ID2 LMODE REQUEST CTIME BLOCK

-------- -------- ---------- ---- ---------- ---------- ---------- ---------- ---------- ----------

81B57F70 81B57F88 324 TM 195954 0 3 0 39 0

81B5801C 81B58034 315 TM 195954 0 3 0 15 0

81BDBBC4 81BDBCE0 315 TX 524292 305626 6 0 15 0

81C32F9C 81C330B8 324 TX 655366 308433 6 0 39 0

8、會話2對a表執行刪除操作,此時刪除1行數據

14:48:37 s2> delete from a where id=4;

1 row deleted

9、再次查看會話3,此時沒有新的鎖增加

14:48:54 s3> select * from v$lock where sid in(324,315);

ADDR KADDR SID TYPE ID1 ID2 LMODE REQUEST CTIME BLOCK

-------- -------- ---------- ---- ---------- ---------- ---------- ---------- ---------- ----------

81B57F70 81B57F88 324 TM 195954 0 3 0 78 0

81B5801C 81B58034 315 TM 195954 0 3 0 54 0

81BDBBC4 81BDBCE0 315 TX 524292 305626 6 0 54 0

81C32F9C 81C330B8 324 TX 655366 308433 6 0

78 0

10、會話2再次刪除b表的數據

14:59:26 s2> delete from b where rownum<=1;

1 row deleted

11、查看鎖的情況,此時發現對b表新產生一個TM鎖,而沒有新增加TX鎖

14:59:35 s3> select * from v$lock where sid in(324,315);

ADDR KADDR SID TYPE ID1 ID2 LMODE REQUEST CTIME BLOCK

-------- -------- ---------- ---- ---------- ---------- ---------- ---------- ---------- ----------

81B57F70 81B57F88 324 TM 195954 0 3 0 1660 0

81B5801C 81B58034 315 TM 195954 0 3 0 1636 0

81B580C8 81B580E0 315 TM 195937 0 3 0 5 0

81BDBBC4 81BDBCE0 315 TX 524292 305626 6 0 1636 0

81C32F9C 81C330B8 324 TX 655366 308433 6 0 1660 0

12、查看195954,195937的對象名稱

15:15:54 s3> select object_name from user_objects where object_id in(195954,195937);

OBJECT_NAME

--------------------------------------------------------------------------------

B

A

15:17:55 s3>

13、新開一個會話4

SQL> set prompt s4

s4> set time on

15:30:29 s4> select sid from v$mystat where rownum<=1;

SID

----------

311

15:30:42 s4> update a_temp set id=1 where rownum<1;

0 rows updated

15:31:05 s4>

14、查看鎖情況

15:29:08 s3> select * from v$lock where sid in(324,315,311);

ADDR KADDR SID TYPE ID1 ID2 LMODE REQUEST CTIME BLOCK

-------- -------- ---------- ---- ---------- ---------- ---------- ---------- ---------- ----------

81B57F70 81B57F88 324 TM 195954 0 3 0 2575 0

81B5801C 81B58034 315 TM 195954 0 3 0 2551 0

81B580C8 81B580E0 315 TM 195937 0 3 0 920 0

81BDBBC4 81BDBCE0 315 TX 524292 305626 6 0 2551 0

81C0708C 81C071A8 311 TX 196647 304362 6 0 3 0

81C32F9C 81C330B8 324 TX 655366 308433 6 0 2575 0

6 rows selected

結論:

DML操作一個會話只會產生一個事務鎖(TX),對每個對象只產生一個表鎖(TM),在不同的會話中可以對同一個對象產生多個TM鎖。

還有在執行dml操作中即使刪除空行也會產生TX鎖,同時伴隨TM鎖,但是更新空行只會產生TX鎖,不會產生TM鎖。

(注:在執行dml操作時,產生的鎖是lmode=6,最高級別的事務鎖。TM鎖是lmode=3的dml級別鎖)。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 孝昌县| 商南县| 绵阳市| 玉林市| 高陵县| 洛扎县| 榕江县| 思南县| 阿巴嘎旗| 沙田区| 咸丰县| 雅安市| 丹凤县| 钦州市| 姜堰市| 孙吴县| 东港市| 射阳县| 蚌埠市| 蒙山县| 庄浪县| 鄂州市| 林西县| 万年县| 古浪县| 安溪县| 阳西县| 恭城| 漠河县| 永修县| 建始县| 安陆市| 仙居县| 禹城市| 岳阳县| 墨江| 抚州市| 莎车县| 安阳市| 广汉市| 同仁县|