MySQL 行級鎖的使用以及死鎖的預防
一、前言
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){ //將使用者的提現資訊新增到提現表 sql:insert into user values(null,"{$uid}",value); //判斷新增結果 if(add_cash_result){ sql:commit }else{ sql:rollback } }else{ sql:rollback; }
其實步驟不復雜,就是開啟事務判斷各個結果為真就提交為假就回滾。單個排他鎖沒有什麼問題,當一個表關聯到多個排他鎖的時候要注意防止發生死鎖。
四、死鎖
`id` 主鍵索引
`name` index 索引
`age` 普通欄位
死鎖產生的根本原因是兩個以上的程式都要求對方釋放資源,以至於程式都一直等待。在程式碼上是因為兩個或者以上的事務都要求另一個釋放資源。
死鎖產生的四個必要條件:互斥條件、環路條件、請求保持、不可剝奪,缺一不可,相對應的只要破壞其中一種條件死鎖就不會產生。
例如下面兩條語句 第一條語句會優先使用`name`索引,因為name不是主鍵索引,還會用到主鍵索引
第二條語句是首先使用主鍵索引,再使用name索引 如果兩條語句同時執行,第一條語句執行了name索引等待第二條釋放主鍵索引,第二條執行了主鍵索引等待第一條的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' );
相關文章
- 剖析6個MySQL死鎖案例的原因以及死鎖預防策略MySql
- 作業系統(5) 死鎖的概念 死鎖產生的必要條件 死鎖的處理策略 預防死鎖 避免死鎖 死鎖的檢測和解除 銀行家演算法作業系統演算法
- mysql行鎖和死鎖檢測MySql
- MySQL全域性鎖、表鎖以及行鎖MySql
- MySQL 避免行鎖升級為表鎖——使用高效的索引MySql索引
- 面試:什麼是死鎖,如何避免或解決死鎖;MySQL中的死鎖現象,MySQL死鎖如何解決面試MySql
- MySQL/InnoDB中,樂觀鎖、悲觀鎖、共享鎖、排它鎖、行鎖、表鎖、死鎖概念的理解MySql
- MySQL 死鎖和鎖等待MySql
- MySQL:一個死鎖分析 (未分析出來的死鎖)MySql
- 死鎖(ora-00060)以及死鎖相關的知識點
- MySQL 行級鎖之 間隙鎖、臨鍵鎖MySql
- 你真的會用mysql行級鎖嗎?mysql 行級鎖全解析MySql
- MySQL死鎖系列-線上死鎖問題排查思路MySql
- Mysql 兩階段鎖和死鎖MySql
- SQ死鎖及死鎖的解決
- Oracle的TX鎖(行級鎖、事務鎖)Oracle
- MySQL複習筆記(05):MySQL表級鎖和行級鎖MySql筆記
- MySQL 死鎖解決MySql
- MySQL死鎖問題MySql
- 【MySQL】漫談死鎖MySql
- MySQL解決死鎖MySql
- 執行緒中的死鎖執行緒
- mysql鎖之三種行級鎖介紹MySql
- MySQL行級鎖測試MySql
- Mysql鎖之行級鎖和表級意向鎖MySql
- MySQL鎖等待與死鎖問題分析MySql
- mysql鎖以及鎖資訊檢視MySql
- MySQL 行級鎖的特點、分類MySql
- 由Oracle觸發器死鎖及行級鎖限制所衍生的解決方案Oracle觸發器
- Java鎖——死鎖Java
- MySQL死鎖案例一(回滾導致死鎖)MySql
- MySQL死鎖案例二(自增列導致死鎖)MySql
- SQLServer的死鎖分析(1):頁鎖SQLServer
- MySQL 死鎖問題分析MySql
- MySQL:死鎖一例MySql
- Mysql如何處理死鎖MySql
- MySQL:MTS和mysqldump死鎖MySql
- MySQL列印死鎖日誌MySql