《MYSQL數據庫Mysql 行級鎖的使用及死鎖的預防方案》要點:
本文介紹了MYSQL數據庫Mysql 行級鎖的使用及死鎖的預防方案,希望對您有用。如果有疑問,可以聯系我們。
MYSQL學習一、前言
MYSQL學習 mysql的InnoDB,支持事務和行級鎖,可以使用行鎖來處理用戶提現等業務.使用mysql鎖的時候有時候會出現死鎖,要做好死鎖的預防.
MYSQL學習二、MySQL行級鎖
MYSQL學習 行級鎖又分共享鎖和排他鎖.
MYSQL學習 共享鎖:
MYSQL學習 名詞解釋:共享鎖又叫做讀鎖,所有的事務只能對其進行讀操作不能寫操作,加上共享鎖后其他事務不能再加排他鎖了只能加行級鎖.
MYSQL學習 用法:
MYSQL學習
SELECT `id` FROM table WHERE id in(1,2) LOCK IN SHARE MODE
MYSQL學習結果集的數據都會加共享鎖
MYSQL學習 排他鎖:
MYSQL學習 名詞解釋:若某個事物對某一行加上了排他鎖,只能這個事務對其進行讀寫,其他事務不能對其進行加任何鎖,其他進程可以讀取,不能進行寫操作,需等待其釋放.
MYSQL學習 用法:
MYSQL學習
SELECT `id` FROM mk_user WHERE id=1 FOR UPDATE
MYSQL學習三、實例應用
MYSQL學習
<?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){
//將用戶的提現信息添加到提現表
sql:insert into user values(null,"{$uid}",value);
//判斷添加結果
if(add_cash_result){
sql:commit
}else{
sql:rollback
}
}else{
sql:rollback;
}
MYSQL學習 其實步驟不復雜,就是開啟事務判斷各個結果為真就提交為假就回滾.單個排他鎖沒有什么問題,當一個表關聯到多個排他鎖的時候要注意防止發生死鎖.
MYSQL學習四、死鎖
MYSQL學習 `id`? 主鍵索引
MYSQL學習 `name` index 索引
MYSQL學習 `age`? 普通字段
MYSQL學習 死鎖產生的根本原因是兩個以上的進程都要求對方釋放資源,以至于進程都一直等待.在代碼上是因為兩個或者以上的事務都要求另一個釋放資源.
MYSQL學習 死鎖產生的四個必要條件:互斥條件、環路條件、哀求保持、不可剝奪,缺一不可,相對應的只要破壞其中一種條件死鎖就不會產生.
MYSQL學習 例如下面兩條語句 第一條語句會優先使用`name`索引,因為name不是主鍵索引,還會用到主鍵索引
MYSQL學習 第二條語句是首先使用主鍵索引,再使用name索引 如果兩條語句同時執行,第一條語句執行了name索引等待第二條釋放主鍵索引,第二條執行了主鍵索引等待第一條的name索引,這樣就造成了死鎖.
MYSQL學習 解決辦法:改造第一條語句 使其根據主鍵值進行更新
MYSQL學習
#①
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學習以上所述是小編給大家介紹的Mysql 行級鎖的使用及死鎖的預防解決辦法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的.在此也非常感謝大家對維易PHP網站的支持!
《MYSQL數據庫Mysql 行級鎖的使用及死鎖的預防方案》是否對您有啟發,歡迎查看更多與《MYSQL數據庫Mysql 行級鎖的使用及死鎖的預防方案》相關教程,學精學透。維易PHP學院為您提供精彩教程。