亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

[翻譯]:SQL死鎖-鎖的類型

2024-07-21 02:50:44
字體:
來源:轉載
供稿:網友
[翻譯]:SQL死鎖-鎖的類型

很久沒有寫博客了,這里面的原因有很多。最近的一個項目由于客戶明確提出要做下性能壓力測試,使用的工具就是VS自帶的壓力測試工具。以前其它項目做壓力測試后反饋的其中一個重要問題就是數據庫的死鎖。沒想到我們這個項目測試時死鎖同樣的發生了,我之前的項目由于很少參與壓力測試,基本上也不會去了解死鎖,以及死鎖如何解決的問題。

既然有了這個需求,那么要想解決死鎖就需要對死鎖的相關知識有一定的了解,對于非DBA的來講并不需要了解的特別深,知道基本概念以及常見分析方法即可,畢竟我們不靠這個吃飯,沒必要達到特別細的境界。于時我找到了這一系列的文章,加上我的理解特此翻譯過來加深印象。

注:我的英文并不是特別好,且我不會嚴格按原文的邏輯順序來翻譯,會加入一些自己的理解,所以為了不讓其它讓被我的翻譯誤解,會有原文對照。

One of the most challenging issues for developers who don’t live in RDBMS world is how to make the system working seamlessly in multi-user environment. The code which works perfectly in development and QA starts to fall apart when dozens of users access the system. There are timeouts, deadlocks and other issues that developer cannot even rePRoduce in house. It does not really matter that SQL Server uses row level locking, that transaction isolation level set to read uncommitted – locking, blocking and deadlocking still occurs.

對于程序員來講最大的挑戰之一就是能夠確保開發的系統在多人使用時也能無縫的工作。有的時候開發堪稱完美的代碼當出現多人訪問系統時會出現系統崩潰的情況,這其中的原因有超時,死鎖或者是其它一些我們意想不到的原因。盡管SQL SERVER是行鎖定,也可以設置事務級別來讀取未提交的數據,但死鎖,阻塞的問題仍然會發生。

Today I’m going to start the series of the posts about locking in Microsoft SQL Server. I’ll try to explain why blocking and deadlocks occur in the system, how you can troubleshoot related problems and what should you do in order to minimize it. We will cover different transaction isolation levels and see how and why it affects behavior of the system. And talk about quite a few other things.

今天我將開始寫一系列關于SQL SERVER鎖的文章,我會解釋為什么阻塞以及死鎖會出現在系統中,以及你怎樣去排除解決這些問題,如何將問題的影響降到最低。我們會通過修改不同的事務級別來看是如何影響系統行為的,同時我也會談一些其它相關的內容。

So let’s start with the lock types. What is the lock? In short, this is in-memory structure (64 bytes on 32 bit OS or 128 bytes on 64 bit OS). The structure has the owner, type and resource hash that links it to the resource it protects (row, page, table, file, database, etc). Obviously it’s more complicated and has quite a few other attributes, but for our practical purposes that level of details is enough.

所以我們首先要了解了鎖的類型。什么是鎖呢?簡單來講,它是一種內存結構(32位操作系統中占64字節,或者64位操作系統占128字節),從保護級別來看,分行鎖,頁鎖,表鎖,數據庫鎖等等。

注:這段我并未深入理解,所以精簡了一些。

SQL Server has more than 20 different lock types but for now let’s focus on the most important ones.

SQL SERVER 有20多種不同的鎖,但我們只需要關注幾種重要的即可。

  • Shared locks (S). Those locks acquired by readers during read Operations such as SELECT. I’d like to mention that it happens in most part of the cases but not all the time. There are some cases when readers don’t acquire (S) locks. We will talk about it later.

共享鎖(S),這些鎖一般出現在我們使用了select語句查詢時,我想提醒的是,并不是所有的select查詢都會有共享鎖,有些情況是不需要共享鎖的,我們后續再講。

  • Exclusive locks (X). Those locks acquired by writers during data modification operators such as Insert, Update or Delete. Those locks prevent one object to be modified by the different sessions. Those locks are always acquired and held till end of transaction

排它鎖(X),這些鎖一般出現在往數據表寫入數據,比如插入數據,更新數據以及刪除數據。排它鎖保證同一時間只有一個會話能夠對數據進行寫入操作至于寫入的事務結束。

  • Update locks (U). Those locks are the mix between shared and exclusive locks. SQL Server uses them with data modification statements while searching for the rows need to be modified. For example, if you issue the statement like: “update MyTable set Column1 = 0 where Column1 is null” SQL Server acquires update lock for every row it processes while searching for Column1 is null. When eligible row found, SQL Server converts (U) lock to (X).

更新鎖(U),這些鎖界于共享鎖以及排它鎖之間。SQL SERVER在調用update語句時先要搜索出哪些數據行是需要更新的。比如我們查詢:“update MyTable set Column1=0 where Colum1 is null” SQL SERVER會申請更新鎖去查詢數據表的每一行是否是符合更新條件的(Column is null)。一旦找到需要更新的數據行,SQL SERVER會將更新鎖升級成排它鎖。

  • Intent locks (IS, IX, IU, etc). Those locks indicate locks on the child objects. For example, if row has (X) lock, it would introduce (IX) locks on page, table and database level. Main purpose of those locks is optimization. This about situation when you need to have exclusive access to the database (i.e. (X) lock on database level). If SQL Server did not have intent locks, it would have to scan all rows in the all objects and see if there are any low level locks acquired.

意向鎖(IS,IX,IU,等等)。這些鎖表明它的子對象中有級別更高的鎖。比如如何一個數據行上有X鎖,會在這個行數據所處的數據頁,表,數據庫級別上存在IX的鎖。這樣設計的主要目的是為了優化。當你需要以獨占方式去訪問數據庫時(如果此時X鎖設置在數據庫級別上),它會遍歷所有對象中的所有行,來判斷是否有比X鎖低的鎖存在。

注:這個我理解的不是很好,可能是SQL SERVER在獲取鎖的機制遵循由低到高的原則,即要想獲得級別高的鎖先要獲取級別低的鎖,從而降低同一資源的相互競爭。

Obviously the biggest question is lock compatibility. If you open MSDN site you’ll see nice and “easy to understand” matrix with more than 400 cells. But for our practical purpose let’s focus on the smaller version:

很明顯,最大的問題就是這些鎖之間的兼容性問題。如果你打開MSDN site你將會看到更加詳細的內容,包含一個超過400個格子的表格。但對于我們來講,只需要關注如下壓縮之后的版本即可。

注:剛開始看的時候,我對作者標注的顏色代表的含義也不太清楚,看了他后面的說明我大致理解了下,具體如下:

    • 綠色:代表完全兼容,不會發生阻塞以及死鎖
    • 黃色:代表在特定情況下會出現不兼容的情況
    • 紅色:最容易造成死鎖

其實這個顏色的標注容易讓人不理解,還是MSDN上的無著色的表格會好比較單純點:

兼容模式

鎖請求模式

IS

S

U

IX

SIX

X

Intent shared (IS)

Yes

Yes

Yes

Yes

Yes

No

Shared (S)

Yes

Yes

Yes

No

No

No

Update (U)

Yes

Yes

No

No

No

No

Intent exclusive (IX)

Yes

No

No

Yes

No

No

Shared with intent exclusive (SIX)

Yes

No

No

No

No

No

Exclusive (X)

No

No

No

No

No

No

So what we need to remember are basically 3 things:

從這張表格中可以得出下面三個關注:

  1. (S) locks are compatible with (S) and (U) locks.

共享鎖和共享鎖以及更新鎖是兼容

  1. (X) locks are incompatible with any other lock types

排它所和任何鎖都不兼容

  1. (U) locks are compatible with (S) but incompatible with (U)

更新鎖和共享鎖之間是兼容的,但更新鎖與更新鎖之間是不兼容的

Simple enough. Next time we will look at transaction isolation levels and see how it affects lock behavior.

下一次我們會講事務級別是如何影響鎖行為的。

原文地址如下:

  • Part 1: Major Lock Types

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线精品高清中文字幕| 久久影院免费观看| www.欧美视频| 国产精品视频最多的网站| 亚洲风情亚aⅴ在线发布| 欧美午夜片在线免费观看| 欧美日韩国产色视频| 久久亚洲精品一区二区| 国产精品电影在线观看| 大伊人狠狠躁夜夜躁av一区| 国产精品第1页| 一本色道久久88亚洲综合88| 亚洲欧美国产精品va在线观看| 永久免费精品影视网站| 911国产网站尤物在线观看| 亚洲国产精品久久91精品| 亚洲欧美一区二区三区在线| 国产亚洲a∨片在线观看| 日韩在线视频网站| 国产精品mp4| 亚洲国产天堂久久国产91| 久久久久在线观看| 欧美在线亚洲一区| 国产精品久久久一区| 国自产精品手机在线观看视频| 中文字幕一区二区精品| 午夜精品美女自拍福到在线| 精品久久久久久| 91高清免费视频| 日韩中文字幕在线视频| 亚洲大胆人体视频| 欧美精品久久久久久久| 日韩欧美高清视频| 成人精品视频久久久久| 欧美成人黄色小视频| 国产日韩专区在线| 国产精品91免费在线| 日韩国产欧美精品在线| 欧美床上激情在线观看| 久久精品人人做人人爽| 北条麻妃久久精品| 久久久在线视频| 精品欧美aⅴ在线网站| 日韩电视剧免费观看网站| 8x海外华人永久免费日韩内陆视频| 国产精品永久免费观看| 精品国产网站地址| 成人在线视频网| 91精品久久久久久久久| 日韩亚洲在线观看| 亚洲国产精品字幕| 成人欧美在线观看| 欧美国产欧美亚洲国产日韩mv天天看完整| 自拍亚洲一区欧美另类| 国产精品久久久久久久久免费| 国产精品久久久久久久av大片| 亚洲精品之草原avav久久| 日韩欧美国产激情| 久久成人免费视频| 亚洲欧美综合精品久久成人| 成人免费直播live| 亚洲国产97在线精品一区| 亚洲精品美女免费| 欧美成人免费一级人片100| 国产精品久久久久久av福利软件| 欧美风情在线观看| 欧美激情亚洲视频| 狠狠做深爱婷婷久久综合一区| 日韩经典一区二区三区| 亚洲级视频在线观看免费1级| 久久综合免费视频| 亚洲一区国产精品| 国产精品久久久久久久久久ktv| 91久久久久久久| 美女av一区二区三区| 亚洲精品在线91| 久久久久久久久久久免费精品| 日韩网站免费观看高清| 狠狠色狠狠色综合日日小说| 国产精品久在线观看| www国产亚洲精品久久网站| 日本三级韩国三级久久| 亚洲欧美第一页| 国产一区二区在线播放| 久久影院中文字幕| 日本一区二区在线免费播放| 国产精品27p| 中文字幕亚洲欧美一区二区三区| 伊是香蕉大人久久| 久久亚洲欧美日韩精品专区| 欧美日韩国产成人| 欧美野外猛男的大粗鳮| 中文亚洲视频在线| 疯狂蹂躏欧美一区二区精品| 亚洲欧美中文日韩v在线观看| 免费91在线视频| 久久精品色欧美aⅴ一区二区| 久久久国产精品免费| 日韩成人在线视频| 欧美精品少妇videofree| 欧美国产亚洲视频| 欧美一级免费视频| 国产精品视频网站| 91高潮精品免费porn| 日韩精品视频免费在线观看| 欧美精品亚州精品| 欧美视频专区一二在线观看| 成人福利网站在线观看| 日韩专区在线播放| 一二美女精品欧洲| 国产精品成人av性教育| 国产视频精品一区二区三区| 久久伊人免费视频| 欧美成人精品不卡视频在线观看| 亚洲一区二区三区sesese| 国产成人福利夜色影视| 国产精品久久久久久久久久| 国产成人免费av| 国产一区二区在线免费视频| 亚洲精品少妇网址| 亚洲xxxx做受欧美| 欧美日韩中文字幕综合视频| 日本人成精品视频在线| 一区二区三欧美| 狠狠色香婷婷久久亚洲精品| 亚洲天堂成人在线| 九九久久久久99精品| 亚洲精品狠狠操| 最近中文字幕mv在线一区二区三区四区| 亚洲www永久成人夜色| 日韩欧美亚洲综合| 中文字幕亚洲一区二区三区| 影音先锋日韩有码| 精品久久久一区二区| 日韩精品中文字幕视频在线| 国产日产欧美精品| 国产亚洲欧洲高清一区| 欧美又大又硬又粗bbbbb| 久久久久久久久国产| 亚洲免费影视第一页| 欧美激情一区二区三区久久久| 国产精品一区二区三区久久久| 久久久在线免费观看| 欧美中文在线免费| 这里只有精品视频在线| 精品久久久久久久久久久| 国产成人精品视频在线观看| 亚洲男人天堂2023| 一区二区欧美在线| 欧美极品少妇xxxxⅹ裸体艺术| 日韩电影在线观看永久视频免费网站| 欧美激情视频网址| 国产+成+人+亚洲欧洲| 日本a级片电影一区二区| 亚洲欧美日韩精品| 4438全国亚洲精品在线观看视频| 亚洲精品影视在线观看| 精品无人区太爽高潮在线播放| 欧美一区二区三区免费视| 中文字幕日韩欧美精品在线观看| 这里只有精品视频| 91视频免费在线| 国产精品第一页在线| 精品国产一区二区三区在线观看|