乐观并发控制(Optimistic Concurrency)

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
简介:

行版本(Row Versioning)

乐观并发模式自SQL Server 2005后引入,并基于行版本控制(Row Versioning)原则。行版本控制背后的想法是读操作(SELECT查询)不再需要获得共享锁(Shared Lock)。不去等待直到成功获得共享锁(Shared Lock),读操作是返回行前一个提交的版本。老的,前一个版本被存储在所谓的版本存储(Version Store)里,这个在TempDb里永驻。写操作(UPDATE,DELETE语句)明确复制老版本到版本存储,新版本中含一个指针指向versionstore里面旧行。下图诠释了这个概念。

 

增加这个指针的一个副作用是每个记录会增加额外的14 bytes。这会带来:

  • 堆表上的转发记录(Forwarding Records)
  • 聚集表上的页分裂(Page Splits)

另外,你也要按需计划和大小TempDb,因为你会引入额外的I/O,在默认配置下会带来竞争问题。现在让我们看看SQL Server提供给你的2个新的乐观隔离级别(optimistic isolation levels)。

乐观隔离级别(Optimistic Isolation Levels)

自SQL Server 2005起,关系引擎提供2个新的乐观隔离级别,它们是基于上一部分讨论过的行版本控制概念。

  • 读提交快照隔离(Read Committed Snapshot Isolation (RCSI))
  • 快照隔离(Snapshot Isolation (SI))

我们来详细看下这2个隔离级别。RCSI提供你基于快照语句级别的隔离。换句话说,SQL Server总会返回你在语句开始前有效的版本。它是提交读隔离级别(Read Committed Isolation Level)的乐观实现。因此使用这个隔离级别你会有不可重复读(Non-Repeatable Reads)。 

复制代码
1 ALTER DATABASE AdventureWorks2012 SET READ_COMMITTED_SNAPSHOT ON
2 GO
3 
4 -- Check if RCSI is now enabled
5 SELECT  name,is_read_committed_snapshot_on
6 FROM sys.databases
7 WHERE database_id = DB_ID('AdventureWorks2012')
8 GO
复制代码

RCSI的一个好处是对数据库/应用程序本身它是完全透明的:你重要在数据库上启用它,然后对于每个查询新的默认隔离级别是读提交快照隔离(Read Committed Snapshot Isolation)。因此通过对指定数据库启用RCSI,你可以克服锁和阻塞问题,即使死锁问题也很容易。下面代码显示了对于给出的数据库如何启用RCSI:

对于你SELECT查询,如果你想有重复读(Repeatable Reads)的乐观方式,你可以使用快照隔离(Snapshot Isolation (SI))隔离级别。快照隔离提供你开箱即用(out of box)的重复读,这就是说你总拿到在你事务开始前有效的行版本。遗憾的是快照隔离并不完全透明:

  • 快照隔离级别必须通过会话明确请求。因此在你的程序里你需要修改代码。
  • 你的查询会执行如所谓的更新冲突(Update Conflicts),SQL Server会回滚事务。因此在你的程序里你需要相应的进行处理这个情况。

下面代码向你展示了对于指定的数据库,如何启用快照隔离(Snapshot Isolation),如何请求这个新的隔离级别。

复制代码
 1 -- Enable Snapshot Isolation (SI)
 2 ALTER DATABASE AdventureWorks2012 SET ALLOW_SNAPSHOT_ISOLATION ON
 3 GO
 4 
 5 -- Check if SI is now enabled
 6 SELECT name, snapshot_isolation_state,  snapshot_isolation_state_desc
 7 FROM sys.databases
 8 WHERE database_id = DB_ID('AdventureWorks2012')
 9 GO
10 
11 USE AdventureWorks2012
12 GO
13 
14 -- Setting the Isolation Level to Snapshot Isolation
15 SET TRANSACTION ISOLATION LEVEL SNAPSHOT
16 GO
复制代码

小结

今天你学习了自SQL Server 2005起支持的2个乐观隔离级别。提交读快照隔离(Read Committed Snapshot Isolation (RCSI))提供你基于语句级别的隔离,快照隔离(Snapshot Isolation (SI))提供你基于事务级别的隔离,因为2个隔离级别使在永驻在TempDb里的版本存储,对于TempDb你需要仔细计划和指定标准。



本文转自Woodytu博客园博客,原文链接:http://www.cnblogs.com/woodytu/p/4686731.html,如需转载请自行联系原作者

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
5月前
|
存储 关系型数据库 数据库
聊多版本并发控制(MVCC)
MVCC是数据库并发控制技术,用于减少读写冲突。它维护数据的多个版本,使事务能读旧数据而写新数据,无需锁定记录。当前读获取最新版本,加锁防止修改;快照读不加锁,根据读取时的读视图(readview)决定读哪个版本。InnoDB通过隐藏字段(DB_TRX_ID, DB_ROLL_PTR)和undo log存储版本,readview记录活跃事务ID。读已提交每次读取都创建新视图,可重复读则在整个事务中复用一个视图,确保一致性。MVCC通过undo log版本链和readview规则决定事务可见性,实现了非阻塞并发读。
236 5
聊多版本并发控制(MVCC)
|
12月前
|
存储 关系型数据库 MySQL
MVCC多版本并发控制
MVCC多版本并发控制 1、MVCC MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。
84 0
|
3月前
|
SQL 监控 Java
深入理解悲观锁与其在并发控制中的应用
深入理解悲观锁与其在并发控制中的应用
|
5月前
|
安全 Java 数据库连接
并发控制利器Semaphore
并发控制利器Semaphore
37 0
|
5月前
|
缓存 安全 Java
JAVA多线程编程与并发控制
```markdown Java多线程编程与并发控制关键点:1) 通过Thread或Runnable创建线程,管理线程状态;2) 使用synchronized关键字和ReentrantLock实现线程同步,防止数据竞争;3) 利用线程池(如Executors)优化资源管理,提高系统效率。并发控制需注意线程安全,避免死锁,确保程序正确稳定。 ```
|
5月前
|
存储 分布式计算 NoSQL
一文带你了解Lakehouse的并发控制:我们是否过于乐观?
一文带你了解Lakehouse的并发控制:我们是否过于乐观?
53 3
|
5月前
|
关系型数据库 MySQL 数据库
并发控制
并发控制
33 1
|
5月前
|
SQL 关系型数据库 MySQL
MySQL事务原理分析(ACID特性、隔离级别、锁、MVCC、并发读异常、并发死锁以及如何避免死锁)
MySQL事务原理分析(ACID特性、隔离级别、锁、MVCC、并发读异常、并发死锁以及如何避免死锁)
145 1
|
存储 关系型数据库 MySQL
第16章_多版本并发控制(上)
第16章_多版本并发控制
94 0
|
存储 关系型数据库 MySQL
多版本并发控制MVCC
多版本并发控制MVCC
多版本并发控制MVCC