-mysql-鎖2

來源:互聯網
上載者:User

標籤:mysql

聲明:本欄目所使用的素材都是凱哥學堂VIP學員所寫,學員有權匿名,對文章有最終解釋權;凱哥學堂旨在促進VIP學員互相學習的基礎上公開筆記。

表級鎖:

之前我們介紹了行級鎖,顧名思義行級鎖就只是鎖住一行或多行資料,因為針對的是行去鎖的,因為一個表格內會有很多行資料,要在這些資料中去鎖定其中幾行資料,是比較耗費資源。而表級鎖則是可以鎖住整個表,所以相對於行級來說沒那麼耗費資源,表級鎖有兩個模式:唯讀模式和唯寫模式,這和檔案許可權裡的唯讀唯寫有點類似。 在一般情況下表格鎖並不經常使用,在這裡只是介紹一下如何使用表級鎖,和解鎖表級鎖,而且表級鎖的資料都可以在網路上尋找到,所以瞭解一下即可,在mysql官方也有表格鎖文法的文檔:

https://dev.mysql.com/doc/refman/5.6/en/lock-tables.html

使用唯讀模式的表級鎖,文法:

LOCK TABLES 表名 READ
樣本:

我們再開啟一個用戶端來看看能否使用SELECT語句查詢這個帶有表級鎖的表格的資料:

因為我們使用的是唯讀模式的表級鎖,自然每個使用者都可以讀取、查詢這個表格的資料,那麼我們可以嘗試一下update這會對錶格資料修改的語句能否執行:

在行級鎖裡即便某些行資料被上鎖了也還是能夠使用insert語句插入資料的,那麼我們試一下在表格鎖裡是否能行得通:

從結果可以得知在表級鎖的唯讀模式下,是不允許任何使用者對上鎖的表格進行任何的修改的。

自然的delete語句也無法使用:

那麼如何解鎖呢?看看解鎖時會發生什麼,解鎖表級鎖的文法很簡單:
UNLOCK TABLES
樣本:

使用唯寫模式的表級鎖,文法:
LOCK TABLES 表名 WRITE
樣本:

在表級鎖的唯寫模式裡,只有上鎖使用者可以對錶格進行寫入資料,其他使用者是不可以寫入資料的,其他使用者就連使用SELECT語句查詢資料都不可以:

上鎖使用者可以使用insert語句插入資料,其他使用者則不允許這個操作:

update語句也是一樣的:

還有delete語句:

如果使用者給一張表格上了表級鎖,那麼這個使用者在給這個表格解鎖之前就只能操作這個表格,資料庫裡的其他表格均不可以進行任何的操作,如果操作就會報錯:

唯寫模式的解鎖文法是一樣的,都是UNLOCK TABLES:

總結一下表級鎖,表級鎖就是針對錶格進行鎖定,相對於行級鎖沒那麼耗資源,表級鎖有兩個模式,唯讀模式和唯寫模式,唯讀模式下上鎖使用者和其他使用者都只能查詢資料不能寫入資料,唯寫模式下上鎖使用者可以進行查詢資料和寫入資料,其他使用者既不能查詢資料,也不能寫入資料,執行任何SQL語句都會進入等待狀態,一直等到表格解鎖為止,當表格解鎖的時候在等待中的事務會馬上被執行。某個使用者對某個表格使用了表級鎖的話,就只能操作那個表格,資料庫裡的其他表格均不可進行任何操作。

悲觀鎖:

悲觀鎖(Pessimistic Lock)是一種概念、解決某些問題的模式,並不是一種特定的機制,悲觀鎖,正如其名,它指的是對資料被外界(包括本系統當前的其他事務,以及來自外部系統的交易處理)修改持保守態度(悲觀),因此,在整個資料處理過程中,將資料處於鎖定狀態。悲觀鎖的實現,往往依靠資料庫提供的鎖機制(也只有資料庫層提供的鎖機制才能真正保證資料訪問的排他性,否則,即使在本系統中實現了加鎖機制,也無法保證外部系統不會修改資料)。

所以簡單來說悲觀鎖就是很悲觀,每次去拿資料的時候都認為別人會修改,所以每次在拿資料的時候都會上鎖,這樣別人想拿這個資料就會block直到它拿到鎖。傳統的關係型資料庫裡邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作之前先上鎖。

例如之前我們做的火車票務系統的小案例,就是使用的悲觀鎖的方式,在我們的代碼裡都是藉助於資料庫內建的鎖機制完成的,當使用者A在購票時使用者B就不能夠購票,或者購票失敗,這就是在整個資料處理過程中,將資料處於鎖定狀態,具有很明顯的排他性(悲觀)。 代碼:

悲觀鎖的優點與不足:

封閉式並行存取控制實際上是“先取鎖再訪問”的保守策略,為資料處理的安全提供了保證。但是在效率方面,處理加鎖的機制會讓資料庫產生額外的開銷,還有增加產生死結的機會;另外,在唯讀型交易處理中由於不會產生衝突,也沒必要使用鎖,這樣做只能增加系統負載;還有會降低了並行性,一個事務如果鎖定了某行資料,其他事務就必須等待該交易處理完才可以處理那資料。

樂觀鎖:

樂觀鎖( Optimistic Locking ) 相對悲觀鎖而言,樂觀鎖假設認為資料一般情況下不會造成衝突,所以在資料進行提交更新的時候,才會正式對資料的衝突與否進行檢測,如果發現衝突了,則讓返回使用者錯誤的資訊,讓使用者決定如何去做。 相對於悲觀鎖,在對資料庫進行處理的時候,樂觀鎖並不會使用資料庫提供的鎖機制。一般的實現樂觀鎖的方式就是記錄資料版本。

資料版本,為資料增加的一個版本標識。當讀取資料時,將版本標識的值一同讀出,資料每更新一次,同時對版本標識進行更新。當我們提交更新的時候,判斷資料庫表對應記錄的目前的版本資訊與第一次取出來的版本標識進行比對,如果資料庫表目前的版本號與第一次取出來的版本標識值相等,則予以更新,否則認為是到期資料。

所以實際上樂觀鎖和悲觀鎖一樣也是一種概念、解決某些業務需求的模式,並不是一種特定的機制,樂觀鎖的主要實現方式是我們開發人員自己通過在資料庫中增加一條儲存資料版本的列,然後通過代碼來判斷這些資料的版本,而不是藉助資料庫內建的鎖來完成的一種鎖定資料的模式。

例如我們假設一種情況:使用者A和使用者B同時在ATM機裡往一個賬戶餘額2000元的賬戶取款,兩個使用者都查詢到賬戶還有2000元,所以使用者A要取款1500,使用者B要取款1000,然後這兩個取款事務會同時提交,如果這個銀行的系統邏輯寫得不夠好的話,就會出現2000-1500-1000=-500的結果,賬戶餘額就會出現負數。

在這種取款的情況下,如果使用悲觀鎖來鎖住資料的話,由於其排他性,那麼另外一個使用者就無法查詢賬戶餘額,只能處於等待狀態,因為在悲觀鎖裡在事務結束之前資料都是處於鎖定狀態,而且在銀行在這種資料量大的地方,使用共用鎖定這種行級鎖也耗費資源。所以就需要用到樂觀鎖了,樂觀鎖只有在操作提交的時候才會去鎖定資料。在樂觀鎖中我們可以給資料設定一個版本號碼,一旦這個資料發生修改,版本號碼就會發生變化,每一個操作都會先判斷版本號碼是否是最新的版本號碼,不是的話就不允許操作,在樂觀鎖的實現過程中我們並不會使用到資料庫內建的鎖,所以使用者們都可以任意的查詢或提交操作。

下面我們做一個簡單的取款系統來示範如何?樂觀鎖:
先準備一個表格裡面填充一行資料:

程式碼範例:

運行結果:

樂觀鎖的優點與不足:

開放式並行存取控制相信事務之間的資料競爭(data race)的機率是比較小的,因此儘可能直接做下去,直到提交的時候才去鎖定,所以不會產生任何鎖和死結。但如果直接簡單這麼做,還是有可能會遇到不可預期的結果,例如兩個事務都讀取了資料庫的某一行,經過修改以後寫回資料庫,這時就遇到了問題。

髒讀簡介:

髒讀就是指當一個事務正在訪問資料,並且對資料進行了修改,而這種修改還沒有提交到資料庫中,這時,另外一個事務也訪問這個資料,然後使用了這個資料。因為這個【學Java,到凱哥學堂kaige123.com】資料是還沒有提交的資料,那麼另外一個事務讀到的這個資料是髒資料(Dirty Data),依據髒資料所做的操作可能是不正確的。

不可重複讀取:

在一個事務內,多次讀同一個資料。在這個事務還沒有結束時,另一個事務也訪問該同一資料。那麼,在第一個事務的兩次讀資料之間。由於第二個事務的修改,那麼第一個事務讀到的資料可能不一樣,這樣就發生了在一個事務內兩次讀到的資料是不一樣的,因此稱為不可重複讀取,即原始讀取不可重複。

幻讀:

幻讀是指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的資料進行了修改,比如這種修改涉及到表中的“全部資料行”。同時,第二個事務也修改這個表中的資料,這種修改是向表中插入“一行新資料”。那麼,以後就會發生操作第一個事務的使用者發現表中還存在沒有修改的資料行,就好象發生了幻覺一樣.一般解決幻讀的方法是增加範圍鎖RangeS,鎖定檢索範圍為唯讀,這樣就避免了幻讀。

-mysql-鎖2

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.