SQL2005中的事宜与锁定(九)

SQL2005中的事务与锁定(九)
SQL2005中的事务与锁定(九)
(一)
------------------------------------
-- Author : HappyFlyStone 
-- Date : 2009-11-09
-- Version: Microsoft SQL Server 2005 - 9.00.2047.00 (Intel X86) 
-- Apr 14 2006 01:12:25 
-- Copyright (c) 1988-2005 Microsoft Corporation
-- Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
-- 转载请注明出处,更多请关注:http://blog.csdn.net/happyflystone
-- 关键字:行版本存储相关知识准备
------------------------------------

15、详述行版本存储区

前面说了好多的行版知识,那在这两种隔离等级下,数据有什么表现呢,这一节我们来详细的说说。
为了更好的分析行版的记录行,先说点相关的知识点。有如下相关的知识我们来学习行版会轻松点。
A、 如何查看数据页面(DBCC PAGE、DBCC TRACEON )
我们可以通过DBCC来查看数据页面内容,这个命令可以看到数据库中的页面报头、数据行及行偏移表。虽然这个命令只是系统管理员才可以执行,但是一般操作人员也不会去看页面内容。

DBCC PAGE的命令格式如下:
DBCC PAGE({dbid|dbname},filenum,pagenum[,printopt])
Dbid|dbname 数据库ID或库名
Filenum 页面的文件号
Pagenum 指定文件内的页面号
Printopt 输出选项:0-默认值,缓冲报头及页面报头
             1-对每记录行分别输出缓冲及页面报头,行偏离表
             2-整体的缓冲、页面报头及行偏离表
             3-完整的报头、行偏离表并可看到行中的各列值

DBCC TRACEON格式:
DBCC TRACEON(3604)
必须先打开跟踪3604来让DBCC PAGE的结果输出给客户端。

我们来看看一个DBCC PAGE的结果(表TA只二条记录):

PAGE: (1:89)
BUFFER:
BUF @0x02BFFDF0
bpage = 0x04938000 bhash = 0x00000000 bpageno = (1:89)
bdbid = 8 breferences = 0 bUse1 = 23490
bstat = 0xc00009 blog = 0x21432159 bnext = 0x00000000
PAGE HEADER:
Page @0x04938000
m_pageId = (1:89) m_headerVersion = 1 m_type = 1
m_typeFlagBits = 0x4 m_level = 0 m_flagBits = 0xa200
m_objId (AllocUnitId.idObj) = 86 m_indexId (AllocUnitId.idInd) = 256  
Metadata: AllocUnitId = 72057594043564032  
Metadata: PartitionId = 72057594038583296 Metadata: IndexId = 0
Metadata: ObjectId = 21575115 m_prevPage = (0:0) m_nextPage = (0:0)
pminlen = 18 m_slotCnt = 2 m_freeCnt = 8022
m_freeData = 166 m_reservedCnt = 0 m_lsn = (45:288:2)
m_xactReserved = 0 m_xdesId = (0:0) m_ghostRecCnt = 0
m_tornBits = -1441945315  
Allocation Status
GAM (1:2) = ALLOCATED SGAM (1:3) = ALLOCATED  
PFS (1:1) = 0x61 MIXED_EXT ALLOCATED 50_PCT_FULL DIFF (1:6) = CHANGED
ML (1:7) = NOT MIN_LOGGED  
DATA:
Slot 0, Offset 0x60, Length 35, DumpStyle BYTE
Record Type = PRIMARY_RECORD Record Attributes = NULL_BITMAP VERSIONING_INFO
Memory Dump @0x3432C060
00000000: 50001200 01000000 61616161 61616161 †P.......aaaaaaaa  
00000010: 61610200 fc000000 00000000 000c0000 †aa..............  
00000020: 000000†††††††††††††††††††††††††††††††...  
--删除了一条记录信息  
OFFSET TABLE:
Row - Offset  
1 (0x1) - 131 (0x83)  
0 (0x0) - 96 (0x60)  
Buffer:当前页面调入内存时,要为了便于管理内存中这个页面生成的一种结构。
Page Head:报头。(部分解释如下)
m_pageId当前页面的文件号及页面号。
m_level当前页面在索引中的级数。
AllocUnitId 分配单元ID,
PartitionId 分区ID,
ObjectId所属对象的ID。
IndexId页面的索引ID。
m_prevPage前一页面指针,
m_nextPage下一页面指针。
Pminlen 行定长部分字节数。
m_freeData页面第一个空闲字节偏移量。
m_slotCnt总记录数。
m_freeCnt 页面空闲字节数。
DATA:记录每一个行的信息。
Slot 0 行号
Offset 0x60 行在页面的偏移量
Length 35 记录长度, 
Record Type 记录类型
Record Attributes 属性描述 VERSIONING_INFO行版 
OFFSET TABLE:行偏移矩阵内容
1 (0x1) – 131 (0x83)  
0 (0x0) – 96 (0x60)