當有多個查詢在同一時刻修改同一資料時,便會產生併發問題。mysql通過鎖來進行併發控制。
讀寫鎖讀鎖又稱共享鎖(s鎖),讀鎖互不干擾,多個客戶在同一時刻可以同時讀取同乙個資源。
寫鎖又稱排他鎖(x鎖),寫鎖則是排他的,寫鎖會阻塞其他寫鎖和讀鎖,以確保在給定時間裡,只有乙個使用者執行寫入,並防止其他使用者讀取正在寫入的同一資源。
鎖粒度鎖粒度指的是鎖定的資料量的多少。在給定的資源中,鎖定的資料量越少,系統的併發程度越高,只要互相不發生衝突即可。
但是鎖的操作也是需要消耗資源的,所謂的錯策略,就是在鎖的開銷和資料的安全性之間尋求平衡,這種平衡也會影響效能。
mysql比較重要的鎖策略有表鎖跟行鎖。
表鎖表鎖是mysql中最基本的所策略,並且是開銷最小的策略。它會鎖住整張表。
可以用以下語句獲取表鎖:
lock tables
tbl_name [[as] alias] lock_type
[, tbl_name [[as] alias] lock_type] ...
lock_type: {
read [local]
| [low_priority] write
unlock tables
當乙個使用者對錶進行寫操作(插入、刪除、更新等)前,先獲取該錶的寫鎖,這會阻塞其他使用者對該錶的所有讀寫操作。只有沒有寫鎖時,其他使用者才能獲取讀鎖,讀鎖之間不相互阻塞。寫鎖比讀鎖擁有更高的優先順序,因此乙個寫請求可能會被插入到讀鎖的前面(寫鎖可以插入到鎖佇列中讀鎖的前面,讀鎖則不能插入到寫鎖的前面)。
read [local] 鎖:
持有鎖的session可以讀取表,但是不能寫入。
多個session可以同時獲取同乙個表的讀鎖。
其他session可以在不顯式獲取讀鎖的情況下讀表。
使用local可以支援某些型別的併發寫操作。在session持有讀鎖的情況下,允許其他session執行不衝突的insert語句(併發插入),但是,read local如果要在持有鎖的同時使用伺服器外部的程序來運算元據庫, 則不能使用它。對於innodb 表,read local跟read一樣。
[low_priority] write 鎖:
持有鎖的session可以讀寫表。
只有持有鎖的會話才能訪問該錶。在釋放鎖之前,沒有其他會話可以訪問它。
只有乙個session可以獲得表的寫鎖,其他session的寫鎖請求會被阻塞。
該low_priority修飾符無效。
mysql 併發 mysql 的讀寫鎖與併發控制
1.無論何時只要有多個查詢在同一時刻修改資料,都會產生併發控制的問題 2.討論mysql在兩個層面,伺服器層和儲存引擎層,如何併發控制讀寫 3.舉了個mbox郵箱檔案的例子,說如果有多個程序同時對mbox檔案寫東西,那麼在檔案的末尾會,交叉混亂的新增,比如程序1寫了幾行,程序2也寫了幾行,互相交叉,...
mysql併發寫原理 mysql的併發控制原理
mysql是主流的開源關係型資料庫,提供高效能的資料儲存服務。在做後端開發時,有時會遇到效能瓶頸,這些瓶頸有時並不是來自應用本身,而是來自資料庫層面。所以所以掌握mysql的一些底層原理有助於我們更好地理解mysql,對mysql進行效能調優,從而開發高效能的後端服務。1 mysql的邏輯框架 my...
MYSQL各字段的長度是多少?
見下表 序號 列型別需要的儲存量 1 tinyint 1 位元組 2 smallint 2 個位元組 3 mediumint 3 個位元組 4 int4 個位元組 5integer 4 個位元組 6 bigint 8 個位元組 7 float x 4 如果 x 24 或8 如果25 x 53 8fl...