SQLServer之创建事务序列化
创建事务序列化注意事项
语法:set transaction isolation level serialize;
序列化会指定下列内容:
-
语句不能读取已由其他事务修改但尚未提交的数据。
-
任何其他事务都不能在当前事务完成之前修改由当前事务读取的数据。
-
在当前事务完成之前,其他事务不能使用当前事务中任何语句读取的键值插入新行。
范围锁处于与事务中执行的每个语句的搜索条件相匹配的键值范围之内。 这样可以阻止其他事务更新或插入任何行,从而限定当前事务所执行的任何语句。 这意味着如果再次执行事务中的任何语句,则这些语句便会读取同一组行。 在事务完成之前将一直保持范围锁。 这是限制最多的隔离级别,因为它锁定了键的整个范围,并在事务完成之前一直保持范围锁。 因为并发级别较低,所以应只在必要时才使用该选项。 该选项的作用与在事务内所有 select 语句中的所有表上设置 holdlock 相同。
使用t-sql脚本创建序列化事务
第一步:创建一个修改会话和一个读取会话。
修改会话脚本:
--声明数据库使用
use testss;
go
--开启修改会话
begin transaction updatetran
update test1 set name='数据库快照' where id='1';
waitfor delay '00:00:10';
commit transaction
go
读取会话脚本:
--声明数据库使用
use testss;
go
--创建读取会话
begin transaction readtran
select * from test1 where id='1';
commit transaction;
go
第二步:运行读取会话,查看读取会话结果并记录,便于与序列化读取会话结果作比较。
第三步:修改读取会话脚本,添加事务隔离级别。
读取会话脚本:
--声明数据库使用
use testss;
go
--设置事务隔离级别
set transaction isolation level serializable;
--创建读取会话
begin transaction readtran
select * from test1 where id='1';
commit transaction;
go
第四步:先执行修改会话,然后立即执行读取会话。
修改会话执行:依次显示修改会话执行状态和执行结果。
读取会话执行:依次显示读取会话执行状态和执行结果。
第五步:结果分析:首先执行修改脚本,在修改脚本执行期间立即执行读取脚本,修改进程在执行,读取进程被阻塞,直到修改脚本执行成功以后,读取脚本才能读取到修改脚本提交的结果。
上一篇: SQL优化经验总结34条