多版本数据原理_第1页
多版本数据原理_第2页
多版本数据原理_第3页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第11章多版本数据原理除了 read uncommitted隔离级别,在 SQL Server 2000版本的其他隔离级别都会发生读 写操作相互等待的情况,使数据库运行效率大幅降低。为了解决这种问题,从SQL Server2005版本开始,引入了多版本数据技术,在一个事务中修改表中的数据时(主要指对表执行update或delete操作),会把旧版本的数据临时存入tempdb数据库,此事务结束之前,其他连接的读操作可以由tempdb数据库读取这些临时数据,而不是从原数据库读取,从而使得 读写操作不再相互等待。本章内容主要包括:数据库开启read_committed_snapshot参数后产生的多

2、版本数据 数据库开启allow_snapshot_isolation参数后产生的多版本数据11.1开启read_committed_snapshot 参数后产生的多版本数据开启read_committed_snapshot参数后,新添加到表中的记录都会在行数据最后附加14字节的版本信息数据,用于指向记录更新后产生的旧版本数据,这些旧版本数据存储于tempdb数据库,开启 read_committed_snapshot参数之前已存在的记录会在其被执行update操作时附加14字节的版本信息。参数开启前后行数据存储方式的变化创建测试数据库testRowVersion ,并在其 中创建测试表t,数据

3、库的 read_committed_snapshot 参数默认未开启。1> create database testRowVersion2> go在testRowVersion数据库中创建测试表t,并添加一行测试记录。1> use testRowVersion2> create table t(a int identity, b char(5) default 'xxxxx')3> go在数据库的read_committed_snapshot参数开启前后,对 t表各添加一行记录。1> insert into t default values2

4、> alter database testRowVersion set read_committed_snapshot on3> insert into t default values4> got分配到的数据页。为了查看t表的两行记录在数据页中的存储形式,先查看表1> dbcc ind(testRowVersion,t,-1)2> goPageFID PagePIDIAMFID IAMPIDObjectID IndexID177 NULLNULL 2105058535015517721050585350先使用参数2执行dbcc page命令,导出55号数据页内容

5、,以下导出内容中的粗体部分 即是表t的两行记录对应的十六进制数据。1> dbcc traceon(3604)2> dbcc page(testRowVersion,1,55,2)3> go3C16C050:00000000 00000000 00000000 00000000 ?3C16C060:10000d00 01000000 7878787878020000?xxxxx.3C16C070:50000d00 02000000 7878787878020000?P.xxxxx.3C16C080:00000000 00000000 5101000000000000?Q.3C1

6、6DFF0:e00f2e01 0e01e400 0010b800 70006000 ?p.'.OFFSET TABLE:Row - Offset1 (0x1) - 112 (0x70)再使用参数3执行dbcc page命令导出55号数据页内容,可以更清楚地看出两行记录的 差别。1> dbcc page(testRowVersion,1,55,3)2> goSlot 0 Offset 0x60 Length 16Record Type = PRIMARY_RECORDRecord Attributes = NULL_BITMAPRecordSize = 16Memory Du

7、mp 0x3D4EC06000000000:10000d00 01000000 78787878 78020000?xxxxx.Slot 0 Column 1 Offset 0x4 Length 4 Length (physical) 4a = 1Slot 0 Column 2 Offset 0x8 Length 5 Length (physical) 5b = xxxxxSlot 1 Offset 0x70 Length 30Record Type = PRIMARY_RECORDRecord Attributes = NULL_BITMAPVERSIONING_INFORecord Siz

8、e = 30Memory Dump 0x3D4EC07000000000:50000d00 02000000 78787878 78020000 ?P.xxxxx.00000010:00000000 00000000 51010000 0000?Q.Version Information =Transaction Timestamp: 337Version Pointer: NullSlot 1 Column 1 Offset 0x4 Length 4 Length (physical) 4a = 2Slot 1 Column 2 Offset 0x8 Length 5 Length (phy

9、sical) 5b = xxxxx由以上导出数据可以看出两行记录存储方式的差异:第1行记录的行头数据第 1个字节为0x10,其二进制数据为:0001 0000。 第2行记录的行头数据第 1个字节为0x50,其二进制数据为:0101 0000。 第2行记录附加了 14字节的版本信息。版本信息前8个字节表示对应的旧版本数据在 tempdb数据库中的RowID,后6个字节 表示修改记录操作所在事务的序号。因为当前还未产生旧版本数据,前8个字节都为0。版本信息各部分的含义请参考 节内容。11.1.2 update产生的旧版本数据及版本信息t表的第1为了观察到update产生的版本信息数据,下面开始一个

10、事务,并在其中更新 行记录。1> begin tran2> update t set b='aaaaa' where a=13> go重新导出55号数据页,查看其第1行记录存储形式的变化。1> dbcc page(testRowVersion,1,55,2)2> go3C16C050:00000000 00000000 00000000 00000000 ?3C16C060:10000d00 01000000 78787878 78020000 ?xxxxx.3C16C070:50000d00 02000000 78787878 78020000

11、?P.xxxxx.3C16C090:OdOOOlOO 00006161 61616102 OOOOcOOO?aaaaa3C16C0A0:3C16DFF0:00000100 00008701 00000000 00005f00 ?e00f2e01 0e01e400 0010b800 70008e00 ?OFFSET TABLE:Row - Offset1 (0x1) - 112 (0x70)0 (0x0) - 142 (0x8e)可以看到,更新后的记录数据被重新添加到数据页的空闲区域,同时修改了slotO的偏移量数值,即第1行记录的偏移量数据指向更新后的数据所存储的位置,而不是在原数据基础上修改

12、。再使用参数3导出55号数据页,可以更清楚地看到第1行记录被更新后,其存储格式的变化。1> dbcc page(testRowVersion,1,55,3)2> goSlot 0 Offset 0x8e Length 30Record Type = PRIMARY_RECORDRecord Attributes = NULL_BITMAPVERSIONING_INFORecord Size = 30Memory Dump 0x3D4EC08E00000000:50000d00 01000000 61616161 61020000 ?P.aaaaa.00000010:cOOOOOOO

13、 01000000 87010000 0000?Version Information =Transaction Timestamp: 391Version Pointer: (file 1 page 192 currentSlotld 0)由上面导出数据的最后部分可以得知,旧版本数据在tempdb数据库的地址为(1:192:0)。14字节版本数据的前 8个字节表示旧版本记录在tempdb数据库中的RowID,后面4个字节表示修改记录所在的事务的序号,其各部分含义可以分解如下。表11-1版本数据的各部分含义原十六进制数据转换前后顺序十进制数据长度表示意义c0 00 00 000xc01924B

14、旧版本记录所在数据页01 000x112B旧版本记录所在文件号00 000x002B旧版本记录slot序号87 01 00 00 00 000x1873916B修改操作所在事务序号导出tempdb数据库的192号数据页,查看其中的旧版本数据。1> dbcc page(tempdb,1,192,2)2> go3D64C050:00000000 00000000 00000000 00000000 ?3D64C060:26010055 00001976 3d702d5d 01870100 ?&.U.v=p-.3D64C070:00000000 00010000 00000000

15、 00050000 ?3D64C080:05000000 0000000d 00000000 010d0000 ?3D64C090:00000000 00941976 3dfe2c5d 01000000 ?.v=.,.3D64C0A0:00000000 00 10000d 00010000 00787878?xxx3D64C0B0:3D64C0C0:78780200 00 000000 00000000 00000000 ?xx00000000 00000000 00000000 00000000 ?OFFSET TABLE:Row - Offset0 (0x0) - 96 (0x60)可以发

16、现,上面粗体部分是表t第1行记录在修改之前在(1:55)号数据页中存储的数据, 从偏移量3D64C060至3D64C0A4为此旧版本数据的行头系统信息。也可以查询动态系统视图sys.dm_tran_version_store得到tempdb数据库中的当前多版本数据信息。1> select transaction_sequence_num, database_id, record_image_first_part2> from sys.dm_tran_version_store3> gotransaction_sequence_num database_id record_im

17、age_first_part以上各种数据之间的关系可以用下图表示。testRowVersion 数据库tempdb数据库记录原数据更新为移入更新后的行数据 旧版本数据指针指向启动另外一个连接,在其中查询t表数据,可以发现此时不再发生等待,而查到的结果恰是存储在tempdb数据库中的旧版本数据。1> use testRowVersion2> go1> select * from t2> goab1 xxxxx2 xxxxx把第1个连接中的事务提交后,表t的第1行记录的存储形式并未发生变化。1> commit2> go1> dbcc page(testRo

18、wVersion,1,55,3)2> goSlot 0 Offset 0x8e Length 30Record Type = PRIMARY_RECORDRecord Attributes = NULL_BITMAPVERSIONING_INFORecord Size = 30Memory Dump 0x3D64C08E00000000:50000d00 01000000 61616161 61020000 ?P.aaaaa.00000010:c0000000 01000000 87010000 0000?Version Information =Transaction Timestam

19、p: 391Version Pointer: (file 1 page 192 currentSlotId 0)但tempdb数据库中的旧版本数据已经失效,如果此时查询tempdb数据库中的旧版本数据,可以看到,这时不再有结果出现。1> select transaction_sequence_num, database_id, record_image_first_part2> from sys.dm_tran_version_store3> gotransaction_sequence_num database_id record_image_first_part(0行受影

20、响)而在连接2中重新查询t表的数据,得到的是提交后的结果。1> select * from t2> goab1 aaaaa2 xxxxx11.1.3 delete操作产生的旧版本数据及版本信息数据delete操作产生的旧版在testRowVersion数据库中重建t表,添加2行记录,用于测试 本数据。1> drop table t2> create table t(a int identity, b char(5) default 'xxxxx')3> go1> insert into t default values2> go 2查看

21、t表分配到的数据页。1> dbcc ind(testRowVersion,t,-1)2> goPageFID PagePIDIAMFID IAMPIDObjectIDIndexID78 NULLNULL21575115777821575115以参数2执行dbcc page命令导出77号数据页,查看t表的2行记录存储的初始状态。1> dbcc traceon(3604)2> dbcc page(testRowVersion,1,77,2)3> go3D7AC050:00000000 00000000 00000000 00000000 ?3D7AC060:50000

22、d00 01000000 78787878 78020000?Pxxxxx.3D7AC070:00000000 000000004c010000 00005000?L.P.3D7AC080:0d000200 00007878 78787802 00000000?xxxxx3D7AC090:00000000 00004d01 0000000000000000?M3D7AC0A0:00000000 00000000 00000000 00000000 ?3D7ADFE0:00000000 00000000 00000000 00000000 ?3D7ADFF0:00000000 00000000

23、21212121 7e006000 ?!.'OFFSET TABLE:Row - Offset1 (0x1) - 126 (0x7e)0 (0x0) - 96 (0x60)再以参数3执行dbcc page命令导出77号数据页数据。1> dbcc page(testRowVersion,1,77,3)2> goSlot 0 Offset 0x60 Length 30Record Type = PRIMARY_RECORDRecord Attributes = NULL_BITMAPVERSIONING_INFORecord Size = 30Memory Dump 0x3D6

24、AC06000000000:50000d00 01000000 78787878 78020000 ?P.xxxxx.00000010:00000000 00000000 4c010000 0000?L.Version Information =Transaction Timestamp: 332Version Pointer: NullSlot 0 Column 1 Offset 0x4 Length 4 Length (physical) 4a = 1Slot 0 Column 2 Offset 0x8 Length 5 Length (physical) 5b = xxxxxSlot 1

25、 Offset 0x7e Length 30Record Type = PRIMARY_RECORDRecord Attributes = NULL_BITMAPVERSIONING_INFORecord Size = 30Memory Dump 0x3D6AC07E00000000:50000d00 02000000 78787878 78020000 ?P.xxxxx.00000010:00000000 00000000 4d010000 0000?M.Version Information =Transaction Timestamp: 333Version Pointer: NullS

26、lot 1 Column 1 Offset 0x4 Length 4 Length (physical) 4a = 2Slot 1 Column 2 Offset 0x8 Length 5 Length (physical) 5b = xxxxx可以看到,行数据中已经包含了版本信息数据,因为当前还未产生旧版本数据,其版本指针为空。开始一个事务,在其中删除 t表的第2行记录。1> begin tran2> delete from t where a=23> go以参数3执行dbcc page命令,重新导出77号数据页数据,可以看到第2行记录后面出现了版本数据。1> dbc

27、c page(testRowVersion,1,77,3)2> goSlot 0 Offset 0x60 Length 30Record Type = PRIMARY_RECORDRecord Attributes = NULL_BITMAPVERSIONING_INFORecord Size = 30Memory Dump 0x3D9AC06000000000:50000d00 01000000 78787878 78020000 ?P.xxxxx.00000010:00000000 00000000 4c010000 0000?L.Version Information =Trans

28、action Timestamp: 332Version Pointer: NullSlot 0 Column 1 Offset 0x4 Length 4 Length (physical) 4a = 1Slot 0 Column 2 Offset 0x8 Length 5 Length (physical) 5b = xxxxxSlot 1 Offset 0x9c Length 15Record Type = GHOST_VERSION_RECORDRecord Attributes = VERSIONING_INFORecord Size = 15Memory Dump 0x3D9AC09

29、C00000000:4eb80000 00010000 007d0100 000000?N.Version Information =Transaction Timestamp: 381Version Pointer: (file 1 page 184 currentSlotId 0)DBCC执行完毕。如果 DBCC输出了错误信息,请与系统管理员联系。如果使用参数2执行dbcc page命令,由最后的偏移量列表数据,可以看到这个未提交 的delete操作把旧版本数据的信息加入了数据页的空闲空间作为表t的第2行记录,但是其中的数据并不包含行数据,在偏移量列表中未标记原数据,即原数据相当于被删除了

30、。1> dbcc page(testRowVersion,1,77,2)13 / 303C2FC050:00000000 00000000 00000000 00000000 ?3C2FC060:50000d00 01000000 78787878 78020000 ?P.xxxxx.3C2FC070:00000000 00000000 4c010000 00005000 ?L.P.3C2FC080:0d000200 00007878 78787802 00000000 ?xxxxx.3C2FC090:00000000 00004d01 000000004eb80000 ?M.N.3C2

31、FC0A0:00010000 007d0100 00000000 00000000 ?.3C2FC0B0:00000000 00000000 00000000 00000000 ?3C2FDFE0:00000000 00000000 00000000 00000000 ?3C2FDFF0:00000000 00000000 21212121 9c006000 ?!.'.OFFSET TABLE:Row - Offset1 (0x1) - 156 (0x9c)0 (0x0) - 96 (0x60)查询sys.dm_tran_version_store动态视图,观察存储在tempdb数据库

32、中的旧版本数据。1> select transaction_sequence_num as tran_seq_num.2>database_id as db_id,3>record_image_first_part as rec_1st_part4> from sys.dm_tran_version_store5> gotran_seq_num db_id rec_1st_part3810x50000D0002000000787878787802000000000000000000004D0100000000这里的查询结果恰是表 t的第2行记录删除之前在数据页中对

33、应的数据。 查看tempdb数据的184号数据页,可以看到旧版本数据存储的状态。1> dbcc page(tempdb,1,184,2)2> go3D9AC050:00000000 00000000 00000000 00000000 ?.3D9AC060:26010063 00001e5a 0100052f 3d7d0100 ?&.c.Z/=.3D9AC070:00000000 00010000 00000000 00050095 ?.3D9AC080:05020000 0000000f 00000000 010d0000 ?.3D9AC090:00bc901f 0580

34、ff03 00800000 00000000 ?3D9AC0A0:00000000 00 50000d 00020000 00787878?.p.xxx3D9AC0B0:78780200 00000000 00000000 004d0100?xx.M.3D9AC0C0:000000 00 8088af05 68ce0100 01000000 ?.h.3D9ADFF0:01000000 a80f0000 4090b205 00006000 ?.'.OFFSET TABLE:Row - Offset0 (0x0) - 96 (0x60)如果回滚以上删除记录的操作,则可以看到SQL Serv

35、er把删除的记录又重新加入了数据页,并且是在数据页的空闲空间区域中加入。1> dbcc page(testRowVersion,1,77,2)2> go3D7AC050:00000000 00000000 00000000 00000000 ?3D7AC060:50000d00 01000000 78787878 78020000 ?P.xxxxx.3D7AC070:00000000 00000000 4c010000 00005000 ?L.P.3D7AC080:0d000200 00007878 78787802 00000000 ?xxxxx3D7AC090:00000000

36、 00004d01 00000000 4eb80000 ?M.N.3D7AC0A0:00010000 007d0100 00000050 000d0002 ?.P.3D7AC0B0:00000078 78787878 02000000 00000000 ?.xxxxx3D7AC0C0:0000004d 01000000 00000000 00000000 ?.M3D7ADFF0:00000000 00000000 21212121 ab006000 ?!.'.OFFSET TABLE:Row - Offset1 (0x1) - 171 (0xab)0 (0x0) - 96 (0x60)

37、注意:这里重新加入的旧版本数据来自于重做日志文件,而不是本数据。如果把delete操作提交,SQL Server会如何处理呢?重新创建表 录。1> drop table ttempdb中存储的旧版t,并添加2行测试记2> create table t(a int identity, b char(5) default 'xxxxx')3> go1> insert into t default values2> go 21> dbcc ind(testRowVersion,t,-1)2> goPageFID PagePIDIAMFID I

38、AMPIDObjectID IndexID78 NULLNULL 535752297717853575229以参数2执行dbcc page命令,导出77号数据页,查看表t的两行记录的初始存储状态。1> dbcc traceon(3604)2> dbcc page(testRowVersion,1,77,2)3> go3D3BC050:00000000 00000000 00000000 00000000 ?3D3BC060:50000d00 01000000 78787878 78020000?Pxxxxx.3D3BC070:00000000 00000000 ab03000

39、0 00005000?P3D3BC080:0d000200 00007878 78787802 00000000?xxxxx3D3BC090:00000000 0000ac03 0000000000000000 ?3D3BC0A0:00010000 007d0100 00000050 000d0002 ?.P.3D3BDFF0:00000000 00000000 21212121 7e006000 ?!.'.OFFSET TABLE:Row - Offset1 (0x1) - 126 (0x7e)0 (0x0) - 96 (0x60)如果最后执行提交,则SQL Server只是把slo

40、t 1的偏移量设置为0,详细信息请参考第7章内容。1> begin tran2> delete from t where a=23> go1> commit2> go1> dbcc page(testRowVersion,1,77,2)2> go3C2FDFF0:00000000 00000000 21212121 00006000 ?!.'.OFFSET TABLE:Row - Offset1 (0x1)-0(0x0)0 (0x0) - 96 (0x60)11.2开启allow_snapshot_isolation参数产生的的多版本数据从SQ

41、L Server 2005版本开始,新加入了snapshot隔离级别,同时数据库增加了allow_s napshot_isolation选项参数。若要在连接中设置snap shot隔离级,需要数据库开启allow_snapshot_isolation 参数。设置snapshot隔离级别后,在此连接的事务中执行的查询只能查到这个事务开始之前 已经提交的数据,同时允许其他连接修改这个事务中所查询的数据,而不会像serializable隔离级别那样,在事务中查到的数据甚至所查询的表不允许其他连接修改,而只能等待查询所在的事务完成后再进行。即开启数据库的allow_snapshot_isolation

42、参数厚,在snapshot隔离级别下,不会再有写等待读的情况发生,这其中起作用的关键是多版本数据,也就是对应一行记录会有不同版本的多份数据存在。多版本数据产生的过程假定数据库已经开启了allow_snapshot_isolation参数,而且对数据库启动了A、B、C三个连接,下面先说明多版本数据产生的过程,具体实验过程请参看后续部分。1)连接A设置为snap shot隔离级别。2)在连接A中开始一个事务并执行了一次查询query_A,为了方便叙述,假定其查询结果为一行,用row_A表示,row_A存储在数据页page_A中。3)连接B对row_A进行了修改,修改结果为row_B, row_B保

43、存在数据页 page_A中,而row_A会被作为旧版本数据存入tempdb数据库,row_A在tempdb数据库中的存储地址作为其版本数据信息保存在row_B中。4)连接B在连接A中的事务结束之前提交了修改结果,即提交了修改操作所在的事务。为了保证在连接 A中再次执行query_A时,查询结果不变,tempdb中存储的 row_A要一直保留,而不能被覆盖,这样对于连接A中查到的一行记录,当前就有了两个版本的数据:一是存储于tempdb数据库中的row_A,一是存储于page_A中的row_B。5)如果此时开启另外一个连接C,并设置为snapshot隔离级别,则此连接中的事务执行query_A查

44、询的结果总为 row_B。6)连接C对row_B进行修改并提交,修改结果为row_C,row_C会保存在数据页page_A中,row_B则会存入tempdb数据库,row_B在tempdb数据库中的存储地 址作为其版本数据信息保存在row_C中。7)如果此时开启另外一个连接继续上述过程,对row_A可以生成更多版本的数据。对于连接 A查到的记录,这时有了三个版本,其中最新的row_C保存在原数据库的page_A,另外两个旧版本的row_B、row_A保存在tempdb数据库中,较新版本的数据同时 保存了其上一个较旧版本数据的地址。在不同时刻开始的事务执行相同的query_A查询,会查到这行记录

45、的不同版本。testRowVersiontestRowVersion-二亍tempdbtestRowVersiontempdbrowC .下面我们进行实验说明多版本数据的产生。11.2.1 allow_s napshot_isolatio n参数开启前后行记录的存储方式与数据库开启read_committed_snapshot 参数的效果相似, 在 allow_snapshot_isolation参数开启后添加的记录会附带14字节的版本信息,而参数开启之前就存在的记录会在其被修改时附带上版本信息。重建testRowVersion数据库。1> drop database testRowVe

46、rsion2> create database testRowVersion3> go在testRowVersion数据库中创建测试表t。1> use testRowVersion2> create table t(a int identity, b char(5) default 'xxxxx')3> go在开启allow_snapshot_isolation参数前后对表t各添加一行记录。1> insert into t default values3> insert into t default values4> go查看t表

47、分配到的数据页信息。1> dbcc ind(testRowVersion,t,-1)2> goPageFID PagePIDIAMFID IAMPIDObjectID IndexID77 NULLNULL 2105058535551772105058535由以上结果可知,t表分配到一个数据页,为(1:55)。导出55号数据页内容,查看两行 记录存储形式的差别。1> dbcc traceon(3604)2> dbcc page(testRowVersion,1,55,2)3> go3C16C050:00000000 00000000 00000000 0000000

48、0 ?3C16C060:10000d00 01000000 78787878 78020000?xxxxx.3C16C070:50000d00 02000000 78787878 78020000?Pxxxxx.3C16C080:3C16DFF0:00000000 00000000 bb040000 00000000 ?e00f2e01 0e01e400 0010b800 70006000 ?p.'.OFFSET TABLE:Row - Offset1 (0x1) - 112 (0x70)0 (0x0) - 96 (0x60)由以上导出结果,可以看到这里的结果与开启read_commi

49、tted_snapshot参数的效果相似,第2行记录附加了 14字节的版本信息,而第1行记录未发生变化。使用参数3再次执行dbcc page命令可以更清楚地看到两行记录的差别。1> dbcc traceon(3604)2> dbcc page(testRowVersion,1,55,3)3> goSlot 0 Offset 0x60 Length 16Record Type = PRIMARY_RECORDRecord Attributes = NULL_BITMAPRecordSize = 16Memory Dump 0x3D64C06000000000:10000d00

50、01000000 78787878 78020000 ?xxxxx.Slot 0 Column 1 Offset 0x4 Length 4 Length (physical) 4a = 1Slot 0 Column 2 Offset 0x8 Length 5 Length (physical) 5b = xxxxxSlot 1 Offset 0x70 Length 30Record Type = PRIMARY_RECORDRecord Attributes = NULL_BITMAPVERSIONING_INFORecord Size = 30Memory Dump 0x3D64C07000

51、000010:00000000 00000000 bb040000 0000?Version Information =Transaction Timestamp: 1211Version Pointer: NullSlot 1 Column 1 Offset 0x4 Length 4 Length (physical) 4a = 2Slot 1 Column 2 Offset 0x8 Length 5 Length (physical) 5b = xxxxx因为未对第2行记录进行过修改,此时还不存在与其对应的旧版本数据,其版本信息只包括事务序号,而不包括其他旧版本数据信息。11.2.2 sn

52、apshot隔离级别下产生的多版本数据为了查看snapshot隔离级别下产生的多版本数据信息,对testRowVersion数据库开启4个连接,分别标记为 A、B、C及D。在连接A中设置snapshot隔离级别,然后开始一个事务,在其中查询t表的第2行记录。1> set transaction isolation level snapshot2> go1> begin tran2> select * from t where a=23> goab2 xxxxx在连接B中,对表t的第2行记录执行update操作,更改其b列的值为"aaaaa",然

53、后 把隔离级别设置为 snapshot,显式开始一个事务,在其中查询t表的第2行记录。1> update t set b='aaaaa' where a=22> go1> set transaction isolation level snapshot2> go1> begin tran2> select * from t where a=23> goab2 aaaaa在连接C中对表t的第2行记录执行update操作,把其b列的值改为"bbbbb”,然后 执行与连接B相似的过程。1> update t set b=

54、9;bbbbb' where a=22> go1> set transaction isolation level snapshot2> go1> begin tran2> select * from t where a=23> goab2 bbbbb在连接D中对表t的第2行记录执行update操作,把其b列的值改为"ccccc”,然后执 行与连接B相似的过程。1> update t set b='ccccc' where a=22> go1> set transaction isolation level snapshot2> go1> begin tran2> select * from t where a=23> goab2 ccccc如果在以上4个连接中分别执行第 2次查询,则其查询结果与各自的第1次结果是相同的。也就是说,对应于 t表的第2行记录,现在有4份数据,这4份数据包括B、C、D 三个连接对表t的第2行记录执行的update操作分别产生的一行旧版本数据,以及最新的修改结果。不同的连接依照其事务开始的不同时刻,各自查到不同的数据。重新导出1:55数据页内容,第1行记录对

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论