惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Threatpost
W
WeLiveSecurity
V
Vulnerabilities – Threatpost
P
Privacy & Cybersecurity Law Blog
Cisco Talos Blog
Cisco Talos Blog
Blog — PlanetScale
Blog — PlanetScale
博客园 - 叶小钗
爱范儿
爱范儿
C
CERT Recently Published Vulnerability Notes
Hugging Face - Blog
Hugging Face - Blog
P
Proofpoint News Feed
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Know Your Adversary
Know Your Adversary
Latest news
Latest news
T
Tor Project blog
NISL@THU
NISL@THU
The Hacker News
The Hacker News
IT之家
IT之家
Last Week in AI
Last Week in AI
T
Tenable Blog
C
Cybersecurity and Infrastructure Security Agency CISA
阮一峰的网络日志
阮一峰的网络日志
小众软件
小众软件
D
Darknet – Hacking Tools, Hacker News & Cyber Security
V
Visual Studio Blog
Apple Machine Learning Research
Apple Machine Learning Research
T
Threat Research - Cisco Blogs
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
CXSECURITY Database RSS Feed - CXSecurity.com
博客园 - 聂微东
T
The Exploit Database - CXSecurity.com
博客园 - 三生石上(FineUI控件)
Spread Privacy
Spread Privacy
S
Secure Thoughts
博客园 - 司徒正美
A
About on SuperTechFans
Attack and Defense Labs
Attack and Defense Labs
Microsoft Security Blog
Microsoft Security Blog
N
News and Events Feed by Topic
O
OpenAI News
V
V2EX
aimingoo的专栏
aimingoo的专栏
L
LangChain Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
S
Security Affairs
MyScale Blog
MyScale Blog
S
Schneier on Security
宝玉的分享
宝玉的分享
Hacker News - Newest:
Hacker News - Newest: "LLM"
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO

博客园 - 东风125

.NET Actor Model Implementations Differ in Approach WCF 数据服务 4.5 XML 文档和数据 Why GUID primary keys are a database’s worst nightmare Conway's Game of Life: An Exercise in WPF, MVVM and C# A CIRCULAR PROGRESSBAR STYLE USING AN ATTACHED VIEWMODEL First MarkDown Blog Folder Recursion with C# 39. Volume Rendering Techniques Service Station - An Introduction To RESTful Services With WCF WPF Wonders: Transformations (and Robots!) Flipping elements with WPF FoLlow 的技术博客 企业级应用架构模型-并发,事务,锁 Web service standards: SOAP, REST, OData, and more A Simple MVVM Example[Forward] The Truth About .NET Objects And Sharing Them Between AppDomains Three Sources of a Solid Object-Oriented Design 加快Bitmap的访问速度
利用索引降低并发事务引起的锁【转】
东风125 · 2015-07-25 · via 博客园 - 东风125

时常,来自不同连接的线程会对同一张表进行读/更新操作,这种并发操作会导致阻塞,同时SQL Server会自动处理以防止脏读。然而,有种情景很常见,那就是每个连接要读/更新的行互相排斥,换句话说,就是各个连接读/更新的行没有交集。在这片文章中,将像大家展示如何恰当地使用索引来降低阻塞的发生,以便多个读/更新能够同时操作同一张表。

创建TEST表如下:

  1. SET ANSI_NULLS ON
  2. GO  
  3. SET QUOTED_IDENTIFIER ON
  4. GO  
  5. CREATE TABLE [dbo].[TEST](  
  6.     [ID] [int] IDENTITY(1,1) NOT NULL,  
  7.     [NAME] [nvarchar](20) NULL,  
  8.     [TEL] [varchar](20) NULL
  9. ) ON [PRIMARY]  
  10. GO 

塞入两笔记录:

  1. INSERT TEST(NAME,TEL)  
  2. SELECT N'阿三','12345678901'
  3. UNION ALL
  4. SELECT N'李四','23456789012'

开启两个查询,分别执行如下T-SQL:

  1. BEGIN TRAN  
  2. UPDATE TEST  WITH(ROWLOCK)  
  3. SET TEL = '11111111111'
  4. WHERE ID=1 
  1. BEGIN TRAN  
  2. UPDATE TEST  WITH(ROWLOCK)  
  3. SET TEL = '22222222222'
  4. WHERE ID=2 

这是我们可以发现第一个T-SQL执行后的状况如下:

 

然而,第二个T-SQL执行时就pending在那里:

通过sp_lock查看:

由上图可以看出,资源1:498424:0被spid(56)排他锁定(X),而迫使spid(52)对其更新(U)等待(WAIT),因此就是我们看到的执行第二个更新事务时,一直处于等待状态,因为排他锁(X)没有释放。 

关于锁模式的说明如下,更多信息可参考官网(http://technet.microsoft.com/zh-cn/library/ms175519.aspx)。

锁模式

说明

共享 (S)
用于不更改或不更新数据的读取操作,如 SELECT 语句。

更新 (U)
用于可更新的资源中。 防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。

排他 (X)
用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。 确保不会同时对同一资源进行多重更新。

意向
用于建立锁的层次结构。 意向锁包含三种类型:意向共享 (IS)、意向排他 (IX) 和意向排他共享 (SIX)。

架构
在执行依赖于表架构的操作时使用。 架构锁包含两种类型:架构修改 (Sch-M) 和架构稳定性 (Sch-S)。

大容量更新 (BU)
在向表进行大容量数据复制且指定了 TABLOCK 提示时使用。

键范围
当使用可序列化事务隔离级别时保护查询读取的行的范围。 确保再次运行查询时其他事务无法插入符合可序列化事务的查询的行。

关于锁定资源的说明如下,更多信息可参考(http://technet.microsoft.com/zh-cn/library/ms189849(v=SQL.105).aspx

资源

说明

RID
用于锁定堆中的单个行的行标识符。

KEY
索引中用于保护可序列化事务中的键范围的行锁。

PAGE
数据库中的 8 KB 页,例如数据页或索引页。

EXTENT
一组连续的八页,例如数据页或索引页。

HoBT
堆或 B 树。 用于保护没有聚集索引的表中的 B 树(索引)或堆数据页的锁。

TABLE
包括所有数据和索引的整个表。

FILE
数据库文件。

APPLICATION
应用程序专用的资源。

METADATA
元数据锁。

ALLOCATION_UNIT
分配单元。

DATABASE
整个数据库。

对于这种这种并发操作,我们可以通过索引来改善锁:

如下创建主键索引:

view plain

  1. ALTER TABLE [dbo].[TEST] ADD CONSTRAINT [PK_TEST] PRIMARY KEY CLUSTERED  
  2. (  
  3.       [ID] ASC
  4. )WITH (PAD_INDEX = OFF,STATISTICS_NORECOMPUTE  =OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  =ON,ALLOW_PAGE_LOCKS  =ON)ON [PRIMARY]  
  5. GO 

这时我们再来执行两个更新事务时,我们发现,均能执行成功,并有没有出现更新(U)等待(WAIT)的的情况。 

执行第一个:

执行第二个:

查看sp_lock,在Type这一栏,并没有出现RID,而出现了KEY,并且KEY的资源不一样,排他锁的状态都是GRANT,基本互不影响。

从上面的演示说明可以看出,正确的索引设置有助于降低并发事务引起的锁。