mysql鎖機制雜談

2021-08-14 18:16:05 字數 1403 閱讀 5093

參考 :

參考 : (一次悲觀鎖引發的)

鎖是計算機協調多個程序或執行緒併發訪問某一資源的機制。在資料庫中,除傳統的計算資源(如cpu、ram、i/o等)的爭用以外,資料也是一種供許多使用者共享的資源。如何保證資料併發訪問的一致性、有效性是所有資料庫必須解決的乙個問題,鎖衝突也是影響資料庫併發訪問效能的乙個重要因素。從這個角度來說,鎖對資料庫而言顯得尤其重要,也更加複雜。

悲觀鎖悲觀鎖的特點是先獲取鎖,再進行業務操作,即「悲觀」的認為獲取鎖是非常有可能失敗的,因此要先確保獲取鎖成功再進行業務操作。通常所說的「一鎖二查三更新」即指的是使用悲觀鎖。通常來講在資料庫上的悲觀鎖需要資料庫本身提供支援,即通過常用的select … for update操作來實現悲觀鎖。當資料庫執行select for update時會獲取被select中的資料行的行鎖,因此其他併發執行的select for update如果試圖選中同一行則會發生排斥(需要等待行鎖被釋放),因此達到鎖的效果。select for update獲取的行鎖會在當前事務結束時自動釋放,因此必須在事務中使用。

樂觀鎖樂觀鎖(optimistic lock), 顧名思義,就是很樂觀,每次去拿資料的時候都認為別人不會修改,所以不會上鎖,但是在更新的時候會判斷一下在此期間別人有沒有去更新這個資料,可以使用版本號等機制。

如下:

1. select data as old_data, version as old_version from …;

2. 根據獲取的資料進行業務操作,得到new_data和new_version

3. update

set data = new_data, version = new_version where version = old_version

if (updated row > 0) else

在大併發的時候,悲觀鎖能夠把資料庫給拖死。

本來可能只是應用 cpu、io 問題,資料庫很清閒。

結果資料庫被應用拖下水,反過來又影響應用,形成滾雪球效應,最終應用假死或直接崩潰。

參考 :

set autocommit=0;

show variables like

"autocommit";

這樣只能當前session禁用自動提交事物,並不能永久關閉自動提交事務。

set autocommit=0;

show variables like

"autocommit";

begin;

select * from vul_user_charge_record where id = 1

forupdate;

update vul_user_charge_record set userid = 300;

commit;

mysql鎖機制 mysql 鎖機制

一 概述 mysql有三種鎖的級別 頁級 表級 行級。myisam和memory儲存引擎採用的是表級鎖 table level locking bdb儲存引擎採用的是頁面鎖 page level locking 但也支援表級鎖 innodb儲存引擎既支援行級鎖 row level locking 也...

mysql鎖機制 php Mysql鎖機制

表級鎖 開銷小,加鎖快 不會出現死鎖 鎖定粒度大,發生鎖衝突的概率最高,併發度最低。行級鎖 開銷大,加鎖慢 會出現死鎖 鎖定粒度最小,發生鎖衝突的概率最低,併發度也最高。共享鎖和排它鎖 頁面鎖 開銷和加鎖時間界於表鎖和行鎖之間 會出現死鎖 鎖定粒度界於表鎖和行鎖之間,併發度一般 mysql的行級鎖有...

mysql鎖機制總結 mysql鎖機制總結

1.隔離級別 1 讀不提交 read uncommited,ru 這種隔離級別下,事務間完全不隔離,會產生髒讀,可以讀取未提交的記錄,實際情況下不會使用。2 讀提交 read commited,rc 僅能讀取到已提交的記錄,這種隔離級別下,會存在幻讀現象,所謂幻讀是指在同乙個事務中,多次執行同乙個查...