天天看點

資料庫鎖原理

1 為什麼需要鎖

資料庫通常有大量的使用者在同時操作,是以并發的情況下需要控制對臨界資源的操作,資料庫通過鎖來控制對臨界資源的通路,進而保證資料的一緻性。例如對于同一個賬戶,操作之前賬戶餘額為1000,同時開始2個事務,一個事務取款100,一個事務往賬戶中彙入100,那麼2個事務結束後,賬戶的餘額必須還是1000,否則要麼銀行不幹,要麼個人不幹。

2 鎖類型

2.1 共享鎖(讀鎖)

讀鎖是共享的,互相不阻塞,也就是可以多個客戶同時讀取同一資源,而不互相幹擾。

加鎖條件:當執行select時,資料庫為這個事務配置設定一把共享鎖,來鎖定被查詢的資料。

解鎖條件:預設情況下,資料被讀取之後,資料庫立即解鎖。例如select * from table中,先鎖定第一行,讀取後,立即解鎖第一行,然後再鎖定第二行,這樣大大降低鎖争用程度。在repeatable read和serializable 這兩種事務隔離級别下,共享鎖是在事務結束時釋放的,serializable對表加鎖。

2.2 排它鎖(獨占鎖)(寫鎖)

寫鎖是排他的,一個寫鎖會阻塞其他的讀鎖和寫鎖,隻有這樣才能保證同一時刻,隻有一個使用者能夠寫入,并阻止其他使用者讀取正在寫入的同一資源。如果要鎖定的資料資源,已經放置了其他的鎖,則不能再放置排它鎖。

加鎖條件:當執行insert update 和delete語句時,資料庫會對操縱的資源使用排它鎖。

解鎖條件:事務結束時解鎖。

3.鎖原理

鎖的基本原理如下:

1.當第一個事務通路資料庫資源時,如果執行select語句,則必須先獲得共享鎖,如果執行insert update和delete時,必須獲得排它鎖

2.當第二個事務也要通路相同的資源時,如果執行select語句,也必須先獲得共享鎖,如果執行insert update或者delete,也必須獲得共享鎖。根據已經放置在資源上的鎖類型,來決定第二個事務是應該等待第一個事務釋放鎖,還是立即獲得鎖。

[img]http://dl2.iteye.com/upload/attachment/0104/2212/53d4fe20-4751-337f-ac03-0568295faec1.gif[/img]

4 鎖粒度

常見的鎖有表鎖、 行鎖、 頁鎖、外鍵鎖等。

鎖有一定的消耗,主要有:獲得鎖,檢查鎖是否已經解除,釋放鎖等,這些操作都會增加系統的開銷。

表鎖開銷比較小,但是并發性能也較差,行鎖并發性能高,但是需要更多鎖,資料庫系統一般都支援鎖的自動更新,例如一個事務中的鎖過多的時候,可能會将行鎖更新到表鎖。

mysql的各個存儲引擎根據不同的應用場景采用不同的鎖機制,MyISAM存儲引擎采用表鎖,InnoDB使用行鎖。如果執行alert table之類的操作,伺服器也會采用表鎖,而忽略存儲引擎的鎖機制。

頁鎖,某些資料庫支援頁鎖,頁鎖粒度介于行鎖和表鎖之間,用于鎖定存放資料的頁,1頁通常含有n個資料行。

外鍵鎖:外鍵會産生進階别的鎖,後面介紹死鎖的時候會提到。

5.樂觀鎖和悲觀鎖

悲觀鎖:假設如果不加鎖就一定會出現問題。

樂觀鎖:先假定不會出現并發問題,出現問題後再采取相應的措施。

悲觀鎖通過select * from tbl for update實作。

樂觀鎖可以在表中加一個version字段,每次更新的時候都+1,這樣如果出現并發,第二次更新的時候version的值已經不再比對,可以在這時采取相應的措施。

6 死鎖

6.1 死鎖是如何産生的

同java的死鎖一樣,都是互相等待對方釋放鎖,造成了互相阻塞,造成的死鎖。

請看下面的表格:

[img]http://dl2.iteye.com/upload/attachment/0104/2214/6bd33583-1a0d-36b8-8910-f19cfb0cfbd6.gif[/img]

6.2 如何避免死鎖

1.修改操作表的順序

從上面的示例中可以看出,如果調整一下操作表的順序就可以避免死鎖。

2.外鍵

如果向子表寫記錄,那麼外鍵限制會檢查父表的記錄,并鎖住父表的記錄,來保證這條記錄不會在這個事務完成之時就被删除了。

産生進階别的鎖,會阻止其他事務操作或者其他DML操作,如果是因為外鍵産生的死鎖,可以去掉外鍵限制,由應用來保證資料的完整性,通常生産環境都不建議加外鍵限制。

3.短事務

縮短事務的執行時間,可以減少鎖的持有時間,可以降低死鎖的風險。

7 鎖可能出現的問題

上鎖是有開銷的,即使不是給資料行而是給資料頁上鎖,也是有一定的時間的,如果第一個事務update一張大表,這時候第二個事務update這張大表比較靠後的位置的資料,這時候就可能會出現,第一個事務還沒來得及給相應的資料上鎖,第二個事務已經上了鎖,是以出現第一個事務要等待第二個事務送出後釋放鎖,才能繼續執行的情況。

8 參考資料

http://www.iteye.com/topic/743285

http://www.iteye.com/topic/236271

http://www.iteye.com/topic/170393

http://thrillerzw.iteye.com/blog/1880242

http://cfeers.iteye.com/blog/760992 *

http://blog.sina.com.cn/s/blog_548bd2090100ir7k.html

http://www.cnblogs.com/ggjucheng/archive/2012/11/14/2770445.html

http://blog.163.com/[email protected]/blog/static/33376057200851625011100/

http://wenku.baidu.com/link?url=kS0uwo_ykqH5PJg7AM39Mf2jrZfOqn7gusgJkf8s2kJShOr-n_9CiykvDqzEIoHxYkokG_XY7keyu6OL-Bn_R4pw3xW1pN0IUNbYxNrdu3q

《Java特種兵》