志当存高远i 发表于 2019-8-26 16:23:19

SQLServer之创建不可重复读


创建不可重复读注意事项
语法:set transaction isolation level repeatable read。

指定语句不能读取已由其他事务修改但尚未提交的行,并且指定,其他任何事务都不能在当前事务完成之前修改由当前事务读取的数据。

对事务中的每个语句所读取的全部数据都设置了共享锁,并且该共享锁一直保持到事务完成为止。 这样可以防止其他事务修改当前事务读取的任何行。 其他事务可以插入与当前事务所发出语句的搜索条件相匹配的新行。 如果当前事务随后重试执行该语句,它会检索新行,从而产生虚拟读取。 由于共享锁一直保持到事务结束,而不是在每个语句结束时释放,因此并发级别低于默认的 READ COMMITTED 隔离级别。 此选项只在必要时使用。

使用T-SQL脚本创建不可重复读
第一步:创建两个会话,一个读取会话, 一个修改会话。
修改会话脚本示例:

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

--开始事务
begin transaction readtran
update test1 set name='事务不可重复读' where id='1';
waitfor delay '00:00:10';
commit transaction;
go

读取会话脚本示例:

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

--开启事务
begin transaction trans
select * from test1 where id='1';
commit transaction;
go


第二步:首先执行读取会话并记录读取会话结果,为不可重复读结果做比较。


第三步:设置读取会话隔离级别为不可重复读。
读取会话脚本示例:

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

--设置会话隔离级别
set transaction isolation level repeatable read;

--开启事务
begin transaction trans
select * from test1 where id='1';
commit transaction;
go

第四步:再次执行,首先执行修改会话,然后执行读取会话。
修改会话:依次显示为执行状态和执行结果。


读取会话:依次显示为执行状态和执行结果。


第六步:结果分析:修改会话在执行期间,读取会话不能读取结果,知道修改会话提交事务,读取会话才立即执行读取到修改结果,不可重复读避免了脏读。
页: [1]
查看完整版本: SQLServer之创建不可重复读