测试SQL SERVER的隔离级别READ_COMMITTED_SNAPSHOT效果例子

背景:今天leader突然想让大家验证一下READ_COMMITTED_SNAPSHOT隔离级别,

结论:READ_COMMITTED_SNAPSHOT设置为off之后,如果事物没提交,查询就一直是等待状态。加with(nolock)能立刻查到。
READ_COMMITTED_SNAPSHOT设置为on之后,能查到更新前的数据。

 

基本SQL:

--获取事物隔离级别:
DBCC USEROPTIONS

--查看is_read_committed_snapshot_on状态
select is_read_committed_snapshot_on,*from sys.databases where name= 'test'

--查看当前连接

select * from master.sys.sysprocesses where dbid = db_id('TEST')

--kill连接

kill spid

--设置READ_COMMITTED_SNAPSHOT 开启(注意:启用之前需要保证当前连接必须是数据库的唯一连接,用上面语句可以KILL掉连接

ALTER DATABASE TEST SET READ_COMMITTED_SNAPSHOT ON

IF OBJECT_ID('Orders','U') IS NOT NULL DROP TABLE Orders 
GO
CREATE TABLE Orders
(ID INT NOT NULL PRIMARY KEY,
Price FLOAT NOT NULL,
type INT NOT NULL
);
INSERT INTO Orders VALUES(10,10.00,1),(11,11.00,1),(12,12.00,1),(13,13.00,1),(14,14.00,1);
GO

1.新建查询,会话框中:将订单10的价格加1,并查询跟新后的价格,并保持事务一直处于打开状态BEGIN TRANSACTION
BEGIN TRANSACTION
UPDATE Orders 
SET Price=Price+1
WHERE ID=10
--查询到的价格是11
SELECT ID,Price,type FROM Orders
WHERE ID=10

2.再新建一个查询,会话框中:
打开事务查询订单10并一直保持事务处于打开状态(此时由于回话1还未提交事务,所以回话2中查询到的还是回话1执行事务之前保存的行版本)
BEGIN TRANSACTION
SELECT ID,Price,type FROM Orders
WHERE ID=10


emmmmm 不知道当时为什么没有发布——2022-3-17






 



 

posted @ 2022-03-17 18:06  歌·颂  阅读(848)  评论(0编辑  收藏  举报