JSX繫結事件
一、鎖的定義
讀鎖(共享鎖):是多事務可以併發讀取資料的鎖,但任何事務都被阻塞等待對該資料進行寫操作和加寫鎖,直到已釋放所有共享鎖。
寫鎖(排他鎖):是指只有當前事務才可以進行讀寫操作的鎖,則其他事務都被阻塞等待對該資料進行讀寫操作和加讀寫鎖,直到已釋放所有排他鎖。
二、鎖特點
- 表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖衝突的概率最高,併發度最低。
- 行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖衝突的概率最低,併發度也最高。
- 頁面鎖:開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定粒度界於表鎖和行鎖之間,併發度一般。
三、MyISAM表鎖
MyISAM 儲存引擎只支援表鎖,MySQL 的表級鎖有兩種模式:表共享讀鎖(Table Read Lock)和表獨佔寫鎖(Table Write Lock)。
讀操作:一旦資料表被加上讀鎖,當一個請求在讀資料時,其他請求也可以讀,但是不能寫,因為一旦另外一個執行緒寫了資料,就會導致當前執行緒讀取到的資料不是最新的了。這就是不可重複讀現象。
寫操作:一旦資料表被加上寫鎖,當一個請求在寫資料時,其他請求不能執行任何操作,因為在當前事務提交之前,其他的請求無法看到本次修改的內容。這有可能產生髒讀、不可重複讀和幻讀。
讀鎖和寫鎖都是阻塞鎖:例如A對資料表增加了寫鎖,如果B請求對資料表加寫鎖,此時B的加鎖請求會一直處於阻塞狀態,直到A釋放了對錶的鎖,B才加鎖成功獲取到結果。
四、表鎖的加鎖/解鎖方式
MyISAM 在執行查詢語句(SELECT
)前,會自動給涉及的所有表加讀鎖,在執行更新操作 (UPDATE
、DELETE
、INSERT
等)前,會自動給涉及的表加寫鎖;因此,使用者一般不需要直接用LOCK TABLE
命令給MyISAM表顯式加鎖。
鎖表:lock tables tbl_name read | wrinte,tbl_name1 read | wrinte,…
解鎖表:unlock table
查看錶加鎖狀態:show open tables like '%tbl_name%';
注意:當某事務在執行 LOCK TABLE
此外,Myisam的讀寫鎖排程是寫優先,因此Myisam不適合做寫為主表的引擎,因為寫鎖後其他執行緒不能做任何操作,大量更新會使查詢很難得到鎖,從而造成永遠堵塞。
五、Innodb行鎖
行級鎖是Mysql中鎖定粒度最細的一種鎖,表示只針對當前操作的行進行加鎖。行級鎖能大大減少資料庫操作的衝突。其加鎖粒度最小,但加鎖的開銷也最大。有可能會出現死鎖的情況。