首页> 数据库> 数据库快照隔离

[文章]数据库快照隔离

收藏
0 95 0

快照隔离:

       启用快照隔离后,将在tempdb中维护每个事务的更新的行版本。唯一的事务序号标识每个事务,并且针对每个行版本记录这些唯一的序号。该事务适用于在事务序列号之前具有序列号的最新行版本。在事务开始之后创建的较新的行版本将被事务忽略。

       快照事务中没有在基础数据行或数据页上获取任何锁,这使其他事务得以执行而不会被先前未完成的事务阻止。修改数据的事务不会阻止读取数据的事务,并且读取数据的事务不会阻止写入数据的事务。这种非阻塞行为还显着降低了复杂事务发生死锁的可能性。通过避免大多数锁定,此方法可以以比事务隔离更低的成本极大地提高并发性。

快照隔离和行版本控制如何工作

a)启用SNAPSHOT隔离级别后,每次更新一行时,SQL Server数据库引擎都会在tempdb中存储原始行的副本,并向该行添加事务序列号。以下是发生的事件顺序:

b)启动一个新的事务,并为其分配一个事务序列号。

c)数据库引擎读取事务中的一行,并从tempdb中检索行版本,其序列号最接近且低于事务序列号。

d)数据库引擎检查快照事务开始时,事务序列号是否不在活动的未提交事务的事务序列号列表中。

e)事务从tempdb读取行的版本,该版本是事务开始时的最新版本。在事务启动之后,将不会看到插入的新行,因为这些序列号的值将高于事务序列号的值。

f)当前事务将看到在事务开始后被删除的行,因为tempdb中将有一个具有较低序号值的行版本。

快照隔离的最终效果是,事务将看到事务开始时存在的所有数据,而无需遵守或在基础表上放置任何锁。在存在争用的情况下,这可以提高性能。

       参考链接:

              https://docs.microsoft.com/en-us/sql/connect/ado-net/sql/snapshot-isolation-sql-server?view=sql-server-ver15

              https://docs.microsoft.com/it-it/sql/t-sql/statements/set-transaction-isolation-level-transact-sql?view=sql-server-ver15

              https://docs.microsoft.com/en-us/sql/connect/jdbc/understanding-isolation-levels?view=sql-server-ver15

              https://docs.microsoft.com/en-us/sql/t-sql/statements/set-transaction-isolation-level-transact-sql?view=sql-server-ver15

 

开启方法:

以下语句激活快照隔离,并用SNAPSHOT替换默认的READ COMMITTED行为

word-spacing:="" -webkit-text-stroke-width:="" border-collapse:="" collapse;="" border:="" margin-left:="" 6.75pt;="" margin-right:="" background-color:="" rgb(255,="" 255,="" 255);"="">

ALTER DATABASE MyDatabase 

SET ALLOW_SNAPSHOT_ISOLATION ON 

  

ALTER DATABASE MyDatabase 

SET READ_COMMITTED_SNAPSHOT ON

     

 

 

      




       设置READ_COMMITTED_SNAPSHOT ON选项可以在默认的READ COMMITTED隔离级别下访问版本化的行。如果READ_COMMITTED_SNAPSHOT选项设置为OFF,则必须为每个会话显式设置快照隔离级别,以便访问版本化的行。

测试:

1、 检查未开启快照隔离。


2、 开启事务,更新表’dbo.test1’


3、 另外开启会话查询表’dbo.test1’,查询被阻塞。


4、 运行命令开启允许快照隔离读提交快照处于打开状态

word-spacing:="" -webkit-text-stroke-width:="" margin-left:="" 18pt;="" border-collapse:="" collapse;="" border:="" background-color:="" rgb(255,="" 255,="" 255);"="">

ALTER DATABASE Test1

SET ALLOW_SNAPSHOT_ISOLATION ON 

  

ALTER DATABASE Test1

SET READ_COMMITTED_SNAPSHOT ON


5、 开启事务,更新表’dbo.test1’


6、 另外开启会话查询表’dbo.test1’,查询未被阻塞。


7、 测试显示,开启读提交快照后可以避免大多数锁定和阻塞,极大的提高并发性。

参考链接:

https://www.sqlshack.com/snapshot-isolation-in-sql-server/

弊端:

      快照隔离具有隐藏的成本:增加tempdb的使用。

综上所述,针对Alwayson的备库有很多的读取被锁的情况,开启读提交快照可以在不整改应用的前提下提高查询效率,建议开启。

数据库
最近热帖
{{item.Title}} {{item.ViewCount}}
近期热议
{{item.Title}} {{item.PostCount}}