您的位置:首页 > 数据库 > Oracle

oracle的TX lock信息在哪里?

2009-12-21 12:43 393 查看
我们都知道ORACLE不会发生锁升级,锁对于ORACLE来说并不是稀缺资源,为什么DML lock对于ORACLE来说不是稀缺资源,下面来寻找答案。

SQL> select * from emp where sal>2999;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
----- ---------- --------- ----- ----------- --------- --------- ------
7788 SCOTT ANALYST 7566 4/19/1987 3000.00 20
7839 KING PRESIDENT 11/17/1981 5000.00 10
7902 FORD ANALYST 7566 12/3/1981 3000.00 20

SQL> select dbms_rowid.rowid_relative_fno(rowid)file_id,dbms_rowid.rowid_block_number(rowid)block_id from emp where sal>2999;

FILE_ID BLOCK_ID
---------- ----------
5 204
5 204
5 204

SQL> update emp set job='ANALYST' where sal>2999;-----此处更新3行,那三行就会被lock

3 rows updated

SQL> select dump(job,'16') from emp where sal>2999;

DUMP(JOB,'16')
--------------------------------------------------------------------------------
Typ=1 Len=7: 41,4e,41,4c,59,53,54
Typ=1 Len=7: 41,4e,41,4c,59,53,54
Typ=1 Len=7: 41,4e,41,4c,59,53,54

SQL> alter system dump datafile 5 block 204;

系统已更改。

我现在省略一些无关信息,贴出主要的DUMP信息

Object id on Block? Y
seg/obj: 0xcd4c csc: 0x00.1a6167 itc: 3 flg: E typ: 1 - DATA
brn: 0 bdba: 0x14000c9 ver: 0x01 opc: 0
inc: 0 exflg: 0

Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0004.001.00000348 0x0080003e.027c.08 ---- 3 fsc 0x0002.00000000

-----此处loc为3说明刚才发生的update就是由这条ITL记录的,loc表示这个事物影响了多少行。
0x02 0x0003.021.000003e9 0x008002f5.021f.16 C--- 0 scn 0x0000.001a41a8

-----此处的flag 为C--- 表示事物已经提交,而且清除了行锁定
0x03 0x0005.016.000003f9 0x008006de.0190.12 --U- 1 fsc 0x0000.001a81eb
---- 此处的 flag 为 --U- 表示这个事物已经提交,但是没有发生块清除,关于块清除这里暂不讨论。
data_block_dump,data header at 0x988787c
===============
tsiz: 0x1f80
hsiz: 0x2e
pbl: 0x0988787c
bdba: 0x014000cc
76543210
flag=--------
ntab=1
nrow=14
frre=-1
fsbo=0x2e
fseo=0x1d25
avsp=0x1d1b
tosp=0x1d1d
0xe:pti[0] nrow=14 offs=0
0x12:pri[0] offs=0x1f5a
0x14:pri[1] offs=0x1f2f
0x16:pri[2] offs=0x1f04
0x18:pri[3] offs=0x1edb
0x1a:pri[4] offs=0x1eae
0x1c:pri[5] offs=0x1e85
0x1e:pri[6] offs=0x1e5c
0x20:pri[7] offs=0x1e34
0x22:pri[8] offs=0x1d25
0x24:pri[9] offs=0x1de3
0x26:pri[10] offs=0x1dbd
0x28:pri[11] offs=0x1d97
0x2a:pri[12] offs=0x1d70
0x2c:pri[13] offs=0x1d49
block_row_dump:
tab 0, row 0, @0x1f5a
tl: 38 fb: --H-FL-- lb: 0x3 cc: 8
col 0: [ 3] c2 4a 46
col 1: [ 5] 53 4d 49 54 48
col 2: [ 5] 43 4c 45 52 4b
col 3: [ 3] c2 50 03
col 4: [ 7] 77 b4 0c 11 01 01 01
col 5: [ 2] c2 0b
col 6: *NULL*
col 7: [ 2] c1 15
tab 0, row 1, @0x1f2f
tl: 43 fb: --H-FL-- lb: 0x0 cc: 8
col 0: [ 3] c2 4b 64
col 1: [ 5] 41 4c 4c 45 4e
col 2: [ 8] 53 41 4c 45 53 4d 41 4e
col 3: [ 3] c2 4d 63
col 4: [ 7] 77 b5 02 14 01 01 01
col 5: [ 2] c2 11
col 6: [ 2] c2 04
col 7: [ 2] c1 1f
tab 0, row 2, @0x1f04
tl: 43 fb: --H-FL-- lb: 0x0 cc: 8
col 0: [ 3] c2 4c 16
col 1: [ 4] 57 41 52 44
col 2: [ 8] 53 41 4c 45 53 4d 41 4e
col 3: [ 3] c2 4d 63
col 4: [ 7] 77 b5 02 16 01 01 01
col 5: [ 3] c2 0d 33
col 6: [ 2] c2 06
col 7: [ 2] c1 1f
tab 0, row 3, @0x1edb
tl: 41 fb: --H-FL-- lb: 0x0 cc: 8
col 0: [ 3] c2 4c 43
col 1: [ 5] 4a 4f 4e 45 53
col 2: [ 7] 4d 41 4e 41 47 45 52
col 3: [ 3] c2 4f 28
col 4: [ 7] 77 b5 04 02 01 01 01
col 5: [ 3] c2 1e 4c
col 6: *NULL*
col 7: [ 2] c1 15
tab 0, row 4, @0x1eae
tl: 45 fb: --H-FL-- lb: 0x0 cc: 8
col 0: [ 3] c2 4d 37
col 1: [ 6] 4d 41 52 54 49 4e
col 2: [ 8] 53 41 4c 45 53 4d 41 4e
col 3: [ 3] c2 4d 63
col 4: [ 7] 77 b5 09 1c 01 01 01
col 5: [ 3] c2 0d 33
col 6: [ 2] c2 0f
col 7: [ 2] c1 1f
tab 0, row 5, @0x1e85
tl: 41 fb: --H-FL-- lb: 0x0 cc: 8
col 0: [ 3] c2 4d 63
col 1: [ 5] 42 4c 41 4b 45
col 2: [ 7] 4d 41 4e 41 47 45 52
col 3: [ 3] c2 4f 28
col 4: [ 7] 77 b5 05 01 01 01 01
col 5: [ 3] c2 1d 33
col 6: *NULL*
col 7: [ 2] c1 1f
tab 0, row 6, @0x1e5c
tl: 41 fb: --H-FL-- lb: 0x0 cc: 8
col 0: [ 3] c2 4e 53
col 1: [ 5] 43 4c 41 52 4b
col 2: [ 7] 4d 41 4e 41 47 45 52
col 3: [ 3] c2 4f 28
col 4: [ 7] 77 b5 06 09 01 01 01
col 5: [ 3] c2 19 33
col 6: *NULL*
col 7: [ 2] c1 0b
tab 0, row 7, @0x1e34
tl: 40 fb: --H-FL-- lb: 0x1 cc: 8 ----此处lb表示这一行被lock了,lock这行的事物是 0x1,也就是刚才看见的ITL 0x1,cc表示有8列
col 0: [ 3] c2 4e 59
col 1: [ 5] 53 43 4f 54 54
col 2: [ 7] 41 4e 41 4c 59 53 54
col 3: [ 3] c2 4c 43
col 4: [ 7] 77 bb 04 13 01 01 01 ----此处[7]表示len=7 与select dump(job,'16') from emp where sal>2999;信息一致
col 5: [ 2] c2 1f
col 6: *NULL*
col 7: [ 2] c1 15
tab 0, row 8, @0x1d25
tl: 36 fb: --H-FL-- lb: 0x1 cc: 8 ---此行被事物0x1 lock

col 0: [ 3] c2 4f 28
col 1: [ 4] 4b 49 4e 47
col 2: [ 7] 41 4e 41 4c 59 53 54
col 3: *NULL*
col 4: [ 7] 77 b5 0b 11 01 01 01 ----此处[7]表示len=7 byte 与select dump(job,'16') from emp where sal>2999;信息一致
col 5: [ 2] c2 33
col 6: *NULL*
col 7: [ 2] c1 0b
tab 0, row 9, @0x1de3
tl: 43 fb: --H-FL-- lb: 0x0 cc: 8
col 0: [ 3] c2 4f 2d
col 1: [ 6] 54 55 52 4e 45 52
col 2: [ 8] 53 41 4c 45 53 4d 41 4e
col 3: [ 3] c2 4d 63
col 4: [ 7] 77 b5 09 08 01 01 01
col 5: [ 2] c2 10
col 6: [ 1] 80
col 7: [ 2] c1 1f
tab 0, row 10, @0x1dbd
tl: 38 fb: --H-FL-- lb: 0x0 cc: 8
col 0: [ 3] c2 4f 4d
col 1: [ 5] 41 44 41 4d 53
col 2: [ 5] 43 4c 45 52 4b
col 3: [ 3] c2 4e 59
col 4: [ 7] 77 bb 05 17 01 01 01
col 5: [ 2] c2 0c
col 6: *NULL*
col 7: [ 2] c1 15
tab 0, row 11, @0x1d97
tl: 38 fb: --H-FL-- lb: 0x0 cc: 8
col 0: [ 2] c2 50
col 1: [ 5] 4a 41 4d 45 53
col 2: [ 5] 43 4c 45 52 4b
col 3: [ 3] c2 4d 63
col 4: [ 7] 77 b5 0c 03 01 01 01
col 5: [ 3] c2 0a 33
col 6: *NULL*
col 7: [ 2] c1 1f
tab 0, row 12, @0x1d70
tl: 39 fb: --H-FL-- lb: 0x1 cc: 8 ----- 这行被事物0x1 lock

col 0: [ 3] c2 50 03
col 1: [ 4] 46 4f 52 44
col 2: [ 7] 41 4e 41 4c 59 53 54
col 3: [ 3] c2 4c 43
col 4: [ 7] 77 b5 0c 03 01 01 01 ----此处[7]表示len=7byte 与select dump(job,'16') from emp where sal>2999;信息一致
col 5: [ 2] c2 1f
col 6: *NULL*
col 7: [ 2] c1 15
tab 0, row 13, @0x1d49
tl: 39 fb: --H-FL-- lb: 0x0 cc: 8
col 0: [ 3] c2 50 23
col 1: [ 6] 4d 49 4c 4c 45 52
col 2: [ 5] 43 4c 45 52 4b
col 3: [ 3] c2 4e 53
col 4: [ 7] 77 b6 01 17 01 01 01
col 5: [ 2] c2 0e
col 6: *NULL*
col 7: [ 2] c1 0b
end_of_block_dump
End dump data blocks tsn: 6 file#: 5 minblk 204 maxblk 204
由此,我们知道ORACLE中的TX -row lock是记录在 block中的,它不像其他数据库那样将lock记录在内存中,避免因为内存资源不足发生锁升级,在ORACLE中,锁开销是很小很小的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: