1、簡介
鎖是計算機協調多個程序或純線程并發通路某一資源的機制。在資料庫中,除傳統的計算資源(CPU、RAM、I/O)的争用以外,資料也是一種供許多使用者共享的資源。如何保證資料并發通路的一緻性、有效性是所在有資料庫必須解決的一個問題,鎖沖突也是影響資料庫并發通路性能的一個重要因素。從這個角度來說,鎖對資料庫而言顯得尤其重要,也更加複雜。
防止更新丢失,并不能單靠資料庫事務控制器來解決,需要應用程式對要更新的資料加必要的鎖來解決。
鎖的運作?
事務T在度某個資料對象(如表、記錄等)操作之前,先向系統送出請求,對其加鎖,加鎖後事務T就對資料庫對象有一定的控制,在事務T釋放它的鎖之前,其他事務不能更新此資料對象。
2、鎖的類别
1)排他鎖:(又稱寫鎖,X鎖)
一句總結:會阻塞其他事務讀和寫。
若事務T對資料對象A加上X鎖,則隻允許T讀取和修改A,其他任何事務都不能再對加任何類型的鎖,直到T釋放A上的鎖。這就保證了其他事務在T釋放A上的鎖之前不能再讀取和修改A。
2)共享鎖:(又稱讀取,S鎖)
一句總結:會阻塞其他事務修改表資料。
若事務T對資料對象A加上S鎖,則其他事務隻能再對A加S鎖,而不能X鎖,直到T釋放A上的鎖。這就保證了其他事務可以讀A,但在T釋放A上的S鎖之前不能對A做任何修改。
X鎖和S鎖都是加載某一個資料對象上的。也就是資料的粒度。
按封鎖的資料粒度分類如下:
1)行級鎖定(row-level):
一句總結:行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖沖突的機率最低,并發度也最高。
詳細:行級鎖定最大的特點就是鎖定對象的顆粒度很小,也是目前各大資料庫管理軟體所實作的鎖定顆粒度最小的。由于鎖定顆粒度很小,是以發生鎖定資源争用的機率也最小,能夠給予應用程式盡可能大的并發處理能力而提高一些需要高并發應用系統的整體性能。
缺陷:由于鎖定資源的顆粒度很小,是以每次擷取鎖和釋放鎖需要做的事情也更多,帶來的消耗自然也就更大了。此外,行級鎖定也最容易發生死鎖。
2)表級鎖定(table-level):
一句總結:表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖沖突的機率最高,并發度最低。
詳細:和行級鎖定相反,表級别的鎖定是MySQL各存儲引擎中最大顆粒度的鎖定機制。該鎖定機制最大的特點是實作邏輯非常簡單,帶來的系統負面影響最小。是以擷取鎖和釋放鎖的速度很快。由于表級鎖一次會将整個表鎖定,是以可以很好的避免困擾我們的死鎖問題。
缺陷:鎖定顆粒度大所帶來最大的負面影響就是出現鎖定資源争用的機率也會最高,緻使并發度大打折扣。
3)頁級鎖定(page-level):(MySQL特有)
一句總結:頁級鎖:開銷和加鎖時間界于表鎖和行鎖之間;會出現死鎖;鎖定粒度界于表鎖和行鎖之間,并發度一般。
詳細:頁級鎖定是MySQL中比較獨特的一種鎖定級别,在其他資料庫管理軟體中也并不是太常見。頁級鎖定的特點是鎖定顆粒度介于行級鎖定與表級鎖之間,是以擷取鎖定所需要的資源開銷,以及所能提供的并發處理能力也同樣是介于上面二者之間。
缺陷:頁級鎖定和行級鎖定一樣,會發生死鎖。
從這裡我們應該引申去思考行鎖更多的缺點:(因為我們執行sql主要依賴行鎖來提高并發度)
1- 比表級鎖、頁級鎖消耗更多記憶體
2- 如果你在大部分資料上經常進行GROUP BY操作或者必須經常掃描整個表,比其它鎖定明顯慢很多。
3- 更容易發生死鎖。