未提交读注意事项
使用 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 指定会话的锁定级别。
一次只能设置一个隔离级别选项,而且设置的选项将一直对那个连接始终有效,直到显式更改该选项为止。 事务中执行的所有读取操作都会在指定的隔离级别的规则下运行,除非语句的 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
第四步:先执行修改脚本,然后执行读取脚本(在修改事务未提交修改结果之前,读取脚本可以直接读取到修改结果)。
修改脚本执行:
读取脚本执行:
第五步:查看结果,修改事务还未提交修改结果,读取事务通过设置会话级别可以直接读取修改事务的结果。