码迷,mamicode.com
首页 > 数据库 > 详细

SQLServer之创建事务未提交读

时间:2018-12-03 11:58:37      阅读:273      评论:0      收藏:0      [点我收藏+]

标签:nsa   ati   name   隔离级别   控制   size   开启   脏读   ola   

未提交读注意事项

使用 SET TRANSACTION ISOLATION LEVEL 指定会话的锁定级别。

一次只能设置一个隔离级别选项,而且设置的选项将一直对那个连接始终有效,直到显式更改该选项为止。 事务中执行的所有读取操作都会在指定的隔离级别的规则下运行,除非语句的 FROM 子句中的表提示为表指定了其他锁定行为或版本控制行为。

事务隔离级别定义了可为读取操作获取的锁类型。 

在事务进行期间,可以随时将事务从一个隔离级别切换到另一个隔离级别,但有一种情况例外。 即在从任一隔离级别更改到 SNAPSHOT 隔离时,不能进行上述操作。 否则会导致事务失败并回滚。 但是,可以将在 SNAPSHOT 隔离中启动的事务更改为任何其他隔离级别。

将事务从一个隔离级别更改为另一个隔离级别之后,便会根据新级别的规则对更改后读取的资源执行保护。 在更改前读取的资源将继续按照以前级别的规则受到保护。

如果在存储过程或触发器中发出 SET TRANSACTION ISOLATION LEVEL,则当对象返回控制时,隔离级别会重设为在调用对象时有效的级别。 

未提交读会造成脏读,事务执行期间读取数据会造成数据前后读取不一致。

使用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 read committed;

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

第四步:先执行修改脚本,然后执行读取脚本(在修改事务未提交修改结果之前,读取脚本可以直接读取到修改结果)。

修改脚本执行:

技术分享图片

读取脚本执行:

技术分享图片

第五步:查看结果,修改事务还未提交修改结果,读取事务通过设置会话级别可以直接读取修改事务的结果。

SQLServer之创建事务未提交读

标签:nsa   ati   name   隔离级别   控制   size   开启   脏读   ola   

原文地址:https://www.cnblogs.com/vuenote/p/10057565.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!