Mysql 行級鎖的使用及死鎖的預防方案

2022-09-29 15:57:20 字數 1663 閱讀 6465

一、前言

mysql的innodb,支援事務和行級鎖,可以使用行鎖來處理使用者提現等業務。使用mysql鎖的時候有時候會出現死鎖,要做好死鎖的預防。

二、mysql行級鎖

行級鎖又分共享鎖和排他鎖。

共享鎖:

名詞解釋:共享鎖又叫做讀鎖,所有的事務只能對其進行讀操作不能寫操作,加上共享鎖後其他事務不能再加排他鎖了只能加行級鎖。

用法:select `id` from table where id in(1,2) lock in share mode

結果集的資料都會加共享鎖

排他鎖:

名詞解釋:若某個事物對某一行加上了排他程式設計客棧鎖,只能這個事務對其進行讀寫,其他事務不能對其進行加任何鎖,其他程序可以讀取,不能進行寫操作,需等待其釋放。

用法:select `id` from mk_user where id=1 for update

三、例項應用

php$uid=$_session['uid'];

//開啟事務

sql:begin

//開啟行級鎖的排他鎖

sql:select `coin` from user where id=$uid for update

//扣除使用者賬戶錢幣

$res=update user set coin=coin-value where id=1;

if($res)",value)www.cppcns.com;

//判斷新增結果

if(add_cash_result)else

}else

其實步驟不複雜,就是開啟事務判斷各個結果為真就提交為假就回滾。單個排他鎖沒有什麼問題,當乙個表關聯到多個排他鎖的時候要注意防止發生死鎖。

四、死鎖

`id`  主鍵索引

`name` index 索引

`age`  普通字段

死鎖產生的根本原因是兩個以上的程序都要求對方釋放資源,以至於程序都一直等待。在**上是因為兩個或者以上的事務都要求另乙個釋放資源。

死鎖產生的四個必要條件:互斥條件、環路條件、請求保持、不可剝奪,缺一不可,相對應的只要破壞其中一種條件死鎖就不會產生。

例如下面兩條語句 第一條語句會優先使用`name`索引,因為name不是主鍵索引,還會用到主鍵索引

第二條語句是首先使用主鍵索引,再使用name索引 如果兩條語句同時執行,第一www.cppcns.com條語句執行了name索引等待第二條釋放主鍵索引,第二條執行了主鍵索www.cppcns.com引等待第一條的name索引,這樣就造成了死鎖。

解決方法:改造第一條語句 使其根據主鍵值進行更新

#①update mk_user set name ='1' where `name`='idis12';

#②update mk_user set name='12' where id=12;

//改造後

update mk_user set name='1' where id=(select id from mk_user where name='idis12' );

以上所述是小編給大家介紹的mysql 行級鎖的使用及死鎖的預防解決方法,希望對大家www.cppcns.com有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對我們**的支援!

本文標題: mysql 行級鎖的使用及死鎖的預防方案

本文位址:

mysql 行級鎖的使用以及死鎖的預防

mysql的innodb,支援事務和行級鎖,可以使用行鎖來處理使用者提現等業務。使用mysql鎖的時候有時候會出現死鎖,要做好死鎖的預防。行級鎖又分共享鎖和排他鎖。共享鎖 名詞解釋 共享鎖又叫做讀鎖,所有的事務只能對其進行讀操作不能寫操作,加上共享鎖後在事務結束之前其他事務只能再加共享鎖,除此之外其...

Mysql行級鎖的使用

用法 selectidfrom table where id in 1,2 lock in share mode 結果集的資料都會加共享鎖 用法 selectidfrom mk user where id 1 for update id主鍵索引 nameindex 索引 age普通字段 死鎖產生的根...

mysql行鎖 死鎖 mysql行鎖和死鎖檢測

行鎖顧名思義,就是針對單行資料加鎖,在mysql中,鎖的實現是由引擎層實現的,myisam引擎就不支援行鎖 不支援行鎖就意味著併發控制只能使用表鎖,也就是說同一時間,在這個表上只能有乙個更新在執行,這就會 影響到業務的併發度。innodb是支援行鎖的,這也是myisam被innodb替代的重要原因之...