欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SQLServer之创建数据库快照

程序员文章站 2023-01-13 20:39:23
创建数据库快照注意事项 语法:set transaction isolation level snapshot; 指定事务中任何语句读取的数据都将是在事务开始时便存在的数据的事务上一致的版本。 事务只能识别在其开始之前提交的数据修改。 在当前事务中执行的语句将看不到在当前事务开始以后由其他事务所做的 ......

创建数据库快照注意事项

语法:set transaction isolation level snapshot;

指定事务中任何语句读取的数据都将是在事务开始时便存在的数据的事务上一致的版本。 事务只能识别在其开始之前提交的数据修改。 在当前事务中执行的语句将看不到在当前事务开始以后由其他事务所做的数据修改。 其效果就好像事务中的语句获得了已提交数据的快照,因为该数据在事务开始时就存在。

除非正在恢复数据库,否则 snapshot 事务不会在读取数据时请求锁。 读取数据的 snapshot 事务不会阻止其他事务写入数据。 写入数据的事务也不会阻止 snapshot 事务读取数据。

在数据库恢复的回滚阶段,如果尝试读取由其他正在回滚的事务锁定的数据,则 snapshot 事务将请求一个锁。 在事务完成回滚之前,snapshot 事务会一直被阻塞。 当事务取得授权之后,便会立即释放锁。

必须将 allow_snapshot_isolation 数据库选项设置为 on,才能开始一个使用 snapshot 隔离级别的事务。如果使用 snapshot 隔离级别的事务访问多个数据库中的数据,则必须在每个数据库中将 allow_snapshot_isolation 都设置为 on。

不能将通过其他隔离级别开始的事务设置为 snapshot 隔离级别,否则将导致事务中止。 如果一个事务在 snapshot 隔离级别开始,则可以将它更改为另一个隔离级别,然后再返回 snapshot。 事务在第一次访问数据时启动。

在 snapshot 隔离级别下运行的事务可以查看由该事务所做的更改。 例如,如果事务对表执行 update,然后对同一个表发出 select 语句,则修改后的数据将包含在结果集中。

在快照隔离模式下,事务中任何语句读取的 filestream 数据都将是在事务开始(而非语句开始)时便存在的数据的事务性一致版本。

使用t-sql脚本创建数据库快照

第一步:开始一个读取会话和修改会话。

读取会话脚本:

--声明数据库使用
use testss;
go

--开启修改会话
begin transaction updatetran
update test1 set name='数据库快照' where id='1';
waitfor delay '00:00:10';
commit transaction
go

修改会话脚本:

--声明数据库使用
use testss;
go

--创建读取会话
begin transaction readtran
select * from test1 where id='1';
commit transaction;
go

第二步:首先执行读取会话脚本,查看读取结果并记录,方便与快照开启之后读取结果进行对比。

SQLServer之创建数据库快照

第三步:修改读取会话脚本。

--声明数据库使用
use testss;
go

--开启数据库快照隔离
--alter database testss set allow_snapshot_isolation on;

--关闭数据库快照隔离
--alter database testss set allow_snapshot_isolation off;

--设置事务隔离级别
set transaction isolation level snapshot;

--创建读取会话
begin transaction readtran
select * from test1 where id='1';
commit transaction;
go

第四步:先执行修改脚本,再执行读取脚本。

修改脚本:依次显示修改脚本执行状态和执行结果。

SQLServer之创建数据库快照

SQLServer之创建数据库快照

读取脚本:依次显示读取脚本读取状态和读取结果。

SQLServer之创建数据库快照

SQLServer之创建数据库快照

第五步:结果分析:首先执行修改脚本,在修改脚本执行期间立即执行读取脚本,读取进程没有阻塞,直接读取到了修改事务开始之前的数据,当修改脚本执行完毕之后,再次执行读取脚本,读取进程并未发生阻塞,事务修改完成读取结果和事务修改执行期间读取结果不同,这说明数据库快照只能读取事务开始之前和结束之后的状态。