SQLServer之创建不可重复读

Posted 小子pk了

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

第四步:再次执行,首先执行修改会话,然后执行读取会话。

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

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

第六步:结果分析:修改会话在执行期间,读取会话不能读取结果,知道修改会话提交事务,读取会话才立即执行读取到修改结果,不可重复读避免了脏读。

以上是关于SQLServer之创建不可重复读的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 中的事务与事务隔离级别以及如何理解脏读, 未提交读,不可重复读和幻读产生的过程和原因

SQL Server 中的事务与事务隔离级别以及如何理解脏读, 未提交读,不可重复读和幻读产生的过程和原因

什么是脏读,幻读和不可重复读

什么是脏读,不可重复读,幻读

MySQL理论:脏读不可重复读幻读

MySQL理论:脏读不可重复读幻读