Tempdb--Snapshot
The insert operation does not cause a row version to be generated because there is really no prvious version of the row being inserted.
both deleted and update operations lead to row versions.
demo:
USE master
GO
-------------------------------------------------------------------
--创建SnapTestDB数据库,并将数据库开启READ_COMMITTED_SNAPSHOT
--和ALLOW_SNAPSHOT_ISOLATION选项
CREATE DATABASE SnapTestDB
GO
ALTER DATABASE SnapTestDB SET READ_COMMITTED_SNAPSHOT ON
GO
ALTER DATABASE SnapTestDB SET ALLOW_SNAPSHOT_ISOLATION ON
GO
---------------------------------------------------------------------
--检查数据库快照设置
SELECT
DB.is_read_committed_snapshot_on,
DB.snapshot_isolation_state_desc,
DB.snapshot_isolation_state
FROM sys.databases DB
WHERE DB.name ='SnapTestDB'
----------------------------------------------------------------------
--创建测试表SnapTestDB.dbo.Test1
USE SnapTestDB
GO
CREATE TABLE SnapTestDB.dbo.Test1(C1 INT,C2 INT)
GO
----------------------------------------------------------------------
--测试在插入时是否会有版本数据
BEGIN TRAN TR1
INSERT SnapTestDB.dbo.Test1(C1,C2)
SELECT 1,1
UNION ALL
SELECT 2,2
SELECT COUNT(1) FROM sys.dm_tran_version_store VS
WHERE VS.database_id=DB_ID('SnapTestDB')
COMMIT
--测试结果:会产生版本数据
----------------------------------------------------------------------
--测试在更新时是否会有版本数据
BEGIN TRAN TR1
UPDATE SnapTestDB.dbo.Test1
SET C1=0
SELECT COUNT(1) FROM sys.dm_tran_version_store VS
WHERE VS.database_id=DB_ID('SnapTestDB')
COMMIT
--测试结果:会产生版本数据
----------------------------------------------------------------------
--测试在更新时是否会有版本数据
BEGIN TRAN TR1
DELETE FROM SnapTestDB.dbo.Test1
WHERE C1=0
SELECT COUNT(1) FROM sys.dm_tran_version_store VS
WHERE VS.database_id=DB_ID('SnapTestDB')
COMMIT
--测试结果:会产生版本数据
----------------------------------------------------------------------
--总结
--在READ_COMMITTED_SNAPSHOT下,由于在TempDB中保存了版本数据,
--因此SELECT不会被其他事务的UPDATE或DELETE所阻塞,从而提高了并发性,
--但也因此加重了TempDB的压力
--只有DELETE和UPDATE才会引发版本数据,版本数据存放在TmepDB中,SQL Server
--会智能地周期性移除那些无用的版本数据,移除版本数据会有一定延迟(不是立即移除无用的版本数据)
--如果版本数据被一个事务使用且该事务长时间未提交,会导致TempDB的占用空间迅速暴增,因此应尽量缩短事务
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现