测试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