MySQL鎖機制&&PHP鎖機制,應用在哪些情境中呢?

來源:互聯網
上載者:User

標籤:root   代碼   準備   names   避免   需要   串連   其他   總結   

本文內容

類比準備--如何類比高並發訪問一個指令碼:apache安裝檔案的bin/ab.exe可以類比並發量

 -c 類比多少並發量 -n 一共請求多少次 http://請求的指令碼

C:\phpStudy\Apache\bin>ab.exe -c 10 -n 10 http://localhost/try.php

MYSQL中的鎖:
文法 :
LOCK TABLE 表名1 READ|WRITE, 表名2 READ|WRITE .................. 【鎖表】
UNLOCK TABLES  【釋放表】


Read:讀鎖|共用鎖定 : 所有的用戶端只能讀這個表不能寫這個表
Write:寫鎖|排它鎖: 所有當前鎖定用戶端可以操作這個表,其他用戶端只能阻塞
注意:在鎖表的過程中只能操作被鎖定的表,如果要操作其他表,必須把所有要操作的表都鎖定起來!

PHP中的檔案鎖 (鎖的是檔案,不是表)
檔案鎖的檔案與表有什麼關係?:一點關係也沒有,與令牌相似,誰拿到誰操作。所以表根本沒鎖。
測試時,有個檔案就行,叫什麼名無所謂

總結:
項目中應該只使用PHP中的檔案鎖,盡量避免鎖表,因為如果表被鎖定了,那麼整個網站中所有和這個表相關的功能都被拖慢了(例如:前台很多使用者一直下訂單,商品表mysql鎖表,其他與商品表相關的操作一直處於阻塞狀態【讀不出來商品表】,因為一個功能把整個網站速度拖慢)。

比如在一個O2O外賣項目中,中午12-2點,晚上6點都是訂單高並發時,這種情況下,MySQL鎖顯然是不考慮的,使用者體驗太差。其實根據實際的需求,外賣可以不用設計庫存量的,當然除了秒殺活動模組還是需要php檔案鎖的。

應用情境:
1. 高並發下單時,減庫存量時要加鎖
2. 高並發搶單、搶票時要使用

MySQL鎖範例程式碼:

<?php    /*    類比秒殺活動-- 商品100件    CREATE TABLE ta    (        id int comment ‘類比100件活動商品的數量‘    );    INSERT INTO ta VALUES(100);    模仿:以10的並發量訪問這個指令碼!    使用apache內建的ab.exe軟體     */         // 關閉錯誤報表     error_reporting(0);      $dbhost = ‘localhost:3306‘;  // mysql伺服器主機地址    $dbuser = ‘root‘;            // mysql使用者名稱    $dbpass = ‘root‘;          // mysql使用者名稱密碼    $conn = mysqli_connect($dbhost, $dbuser, $dbpass);    if(! $conn )    {        die(‘串連失敗: ‘ . mysqli_error($conn));    }    // 設定編碼,防止中文亂碼    mysqli_query($conn , "set names utf8");    mysqli_select_db( $conn, ‘temp‘ );     # mysql 鎖     mysqli_query($conn , ‘LOCK TABLE a WRITE‘);// 只有一個用戶端可以鎖定表,其他用戶端阻塞在這     $rs = mysqli_query($conn , ‘SELECT id FROM a‘);     $id = mysqli_result($rs, 0, 0);     if($id > 0)     {         --$id;         mysqli_query($conn , ‘UPDATE a SET id=‘.$id);     }     # mysql 解鎖     mysqli_query($conn , ‘UNLOCK TABLES‘);    //查詢解鎖後的id值    // $res = mysqli_query($conn , ‘SELECT id FROM ta‘);    // while($row = mysqli_fetch_assoc($res))    // {    //     $id = $row[‘id‘];    // }    // echo $id;

PHP檔案鎖範例程式碼:

<?php    /*    類比秒殺活動-- 商品100件    CREATE TABLE ta    (        id int comment ‘類比100件活動商品的數量‘    );    INSERT INTO ta VALUES(100);    模仿:以10的並發量訪問這個指令碼!    使用apache內建的ab.exe軟體     */         // 關閉錯誤報表     error_reporting(0);      $dbhost = ‘localhost:3306‘;  // mysql伺服器主機地址    $dbuser = ‘root‘;            // mysql使用者名稱    $dbpass = ‘root‘;          // mysql使用者名稱密碼    $conn = mysqli_connect($dbhost, $dbuser, $dbpass);    if(! $conn )    {        die(‘串連失敗: ‘ . mysqli_error($conn));    }    // 設定編碼,防止中文亂碼    mysqli_query($conn , "set names utf8");    mysqli_select_db( $conn, ‘temp‘ );     # php中的檔案鎖     $fp = fopen(‘./a.lock‘, ‘r‘); // php的檔案鎖和表沒關係,隨便一個檔案即可     flock($fp, LOCK_EX);// 獨佔鎖定     $retval = mysqli_query($conn ,‘SELECT id FROM ta‘);     while($row = mysqli_fetch_assoc($retval))    {        $id =  $row[‘id‘];    }        if($id > 0)     {         --$id;         mysqli_query($conn ,‘UPDATE ta SET id=‘.$id);     }     # php的檔案鎖,釋放鎖     flock($fp, LOCK_UN);     fclose($fp);    // $res = mysqli_query($conn , ‘SELECT id FROM ta‘);    // while($row = mysqli_fetch_assoc($res))    // {    //     $id = $row[‘id‘];    // }    // echo $id;

文章來自於:部落格

連結:http://www.cnblogs.com/foxy/p/9204892.html

MySQL鎖機制&&PHP鎖機制,應用在哪些情境中呢?

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.