事务提交读注意事项
语法:set transaction isolation level read committed。
数据库默认的是两个会话事务之间是提交读。
READ COMMITTED指定语句不能读取已由其他事务修改但尚未提交的数据。 这样可以避免脏读。 其他事务可以在当前事务的各个语句之间更改数据,从而产生不可重复读取和虚拟数据。 该选项是 SQL Server 的默认设置。
READ COMMITTED 的行为取决于 READ_COMMITTED_SNAPSHOT 数据库选项的设置:
如果将 READ_COMMITTED_SNAPSHOT 设置为 OFF(默认设置),则 数据库引擎会使用共享锁防止其他事务在当前事务执行读取操作期间修改行。 共享锁还会阻止语句在其他事务完成之前读取由这些事务修改的行。 共享锁类型确定它将于何时释放。 行锁在处理下一行之前释放。 页锁在读取下一页时释放,表锁在语句完成时释放。
如果将 READ_COMMITTED_SNAPSHOT 设置为 ON,则 数据库引擎会使用行版本控制为每个语句提供一个在事务上一致的数据快照,因为该数据在语句开始时就存在。 不使用锁来防止其他事务更新数据。
使用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
第二步:首先执行读取会话脚本,查看并记录读取结果,为提交读作比较。
第三步:首先不添加隔离级别查看数据读取结果,先执行修改会话,在执行读取会话。
修改会话:依次显示修改执行状态和执行结果。
读取会话:依次显示执行状态和执行结果。
第四步:(未设置会话隔离级别)结果分析:首先执行修改后会话,然后立即执行读取会话,中间会有两秒的点击时间间隔,等待两个事物都执行完毕查看执行结果,修改会话使用了10s,读取会话使用了8s(中间有两秒的点击时间差),读取会话在修改会话完成后顺利读取到了修改结果,与第二步结果执行查询的结果不同。
第五步:在读取会话设置隔离级别,重新运行第三步,结果与第四步分析一直。
读取会话脚本:
--声明数据库引用
use testss;
go
--设置会话隔离级别
set transaction isolation level read committed;
--开启事务
begin transaction trans
select * from test1 where id='1';
commit transaction;
go