隔离级别
SQL server 默认的隔离级别为 RC ,同一事务会读取到当前状态下已提交的最新数据记录,
但是该隔离级别下,并行化的程度并不是很好,由于他并没有实现多版本并行化的程度,当一个事务拿到X锁的时候并没有提交释放的时候,会与其它读锁S锁起到冲突,所以效果并不是很好。
相关信息与设置
-- 查看当前隔离级别 DBCC Useroptions -- 查看数据库并发性支持 select name,user_access,user_access_desc, snapshot_isolation_state,snapshot_isolation_state_desc, is_read_committed_snapshot_on from sys.databases -- 提升数据库并发行参数修改 ALTER DATABASE dbname SET SINGLE_USER WITH ROLLBACK IMMEDIATE ALTER DATABASE dbname SET ALLOW_SNAPSHOT_ISOLATION ON ALTER DATABASE db1 SET READ_COMMITTED_SNAPSHOT ON ALTER DATABASE dbname SET MULTI_USER
这里,绘画设置的隔离级别为 RCS 快照读
快照读
ALTER DATABASE dbname SET READ_COMMITED_SNAPSHOT ON; --设置 库名根据情况
sql server 设置了两种 乐观 的并发控制,Read Committed SNAPSHOT 和 snapshot
两种隔离界别都是基于 行的。在一定程度上解决 RC 隔离级别并发性差的问题。
SNAPSHOT
(1)SNAPSHOT 在SNAPSHOT隔离级别下,当读取数据时可以保证操作读取的行是事务开始时可用的 最后提交版本
(2)同时SNAPSHOT隔离级别也满足前面的已提交读,可重复读,不幻读;该隔离级别实用的不是共享锁,而是行版本控制
测试
会话1
开启快照
ALTER DATABASE dbname SET ALLOW_SNAPSHOT_ISOLATION ON;
修改数据查看
BEGIN TRAN; UPDATE dbo.Customers SET cust_country= 'USA' WHERE cust_id = 1000000001; SELECT * FROM dbo.Customers WHERE cust_id =1000000001 ;
发现现在 国家已经修改成 USA
会话2
设置成快照,并且查看
SET TRANSACTION ISOLATION LEVEL SNAPSHOT; BEGIN TRAN; SELECT * FROM dbo.Customers WHERE cust_id =1000000001 ;
发现数据还是之前的 CN
会话1提交
COMMIT TRAN;
提交事务后,国家为USA 的 当期版本就变成了 最新的 提交版本。
会话2中再次读取数据,此时数据仍然 显示国家 为 CN 因为事务还未提交,事务所保存的快照并不会发生改变
会话2提交
COMMIT TRAN;
体现出 该快照是保证操作读取的行是事务开始时可用的 最后提交版本。
Read Committed Snapshot
READ COMMITTED SNAPSHOT也是基于行版本控制,但是READ COMMITTED SNAPSHOT的隔离级别是 读操作 之前的最后已提交版本,而不是事务前的已提交版本
测试
会话1
发先隔离界别已经是 RCS
修改查看
BEGIN TRAN; UPDATE dbo.Customers SET cust_country= 'CN' WHERE cust_id = 1000000001; SELECT * FROM dbo.Customers WHERE cust_id =1000000001 ;
国家已经修改成 CN 了
会话2
在连接2中,打开一个事务并尝试读,并使事务处于打开状态
运行后得到最近提交的版本
现在在 会话1 中提交事务
COMMIT TRAN;
会话2再次查看
证实了不管当前会话有没有提交,读取的结果都是 读操作 之前的最后已提交版本,而不是事务前的已提交版本