在開發專案時,遇到乙個問題,就是要隨機讀取一張表的部分記錄,並update設定為不可在讀,這裡就有乙個問題,可能多個人同時隨機到相同的記錄,並重複做update操作,引起資料髒讀和重複操作,
因此考慮給表加鎖。但是採用了myisam,不支援事務,只能加表級鎖,而且別人連讀的許可權都沒有。下面是2個測試檔案,在firefox執行test.php,在ie裡執行test1.php,會發現,火狐執行後10秒內,ie裡處於等待狀態,其實就是test.php裡給表加了鎖,網頁沒執行結束,鎖未被釋放,當10秒過後,鎖自動被釋放,ie裡馬上出現內容了,這樣做實現了隨機讀取表的記錄並修改,但是帶來的缺憾是鎖表期間,其他程序對該錶的讀的許可權也沒有,也就是使用者在操作表記錄時,管理員都沒有讀的許可權,還是得修改表引擎,換成innodb,用事務來解決。
test1.php
$db=new db();
$db->locktable("lock tables sbs_temp write");
$sql="select * from sbs_temp limit 5";
$rs=$db->getrs($sql);
foreach($rs as $row)
test.php
$db=new db();
$db->locktable("lock tables sbs_temp write");
$sql="select * from sbs_temp limit 5";
$rs=$db->getrs($sql);
foreach($rs as $row)
sleep(10);
表級鎖的mysql讀寫 Mysql的表級鎖
我們首先需要知道的乙個大前提是 mysql的鎖是由具體的儲存引擎實現的。所以像mysql的預設引擎myisam和第三方外掛程式引擎 innodb的鎖實現機制是有區別的。可根據不同的場景選用不同的鎖定機制。mysql有三種級別的鎖定 表級鎖定 頁級鎖定 行級鎖定 一 定義 每次鎖定的是一張表的鎖機制就...
MySQL行級鎖 表級鎖
行級鎖 表級鎖的資料不能被其它事務再鎖定,也不被其它事務修改 修改 刪除 是表級鎖時,不管是否查詢到記錄,都會鎖定表 innodb 行鎖是通過給索引上的索引項加鎖 來實現的,這一點mysql與 oracle 不同,後者是通過在資料塊中對相應資料行加鎖來實現的。innodb這種行鎖實現特點意味著 只有...
mysql的行級鎖 表級鎖 頁級鎖
鎖是在執行多執行緒時用於強行限制資源訪問的同步機制,即用於在併發控制中保證對互斥要求的滿足 行級鎖 是mysql中鎖定粒度最細的一種鎖,表示只針對當前操作的行進行加鎖。行級鎖能大大減少資料庫操作的衝突。其加鎖粒度最小,但加鎖的開銷也最大。行級鎖分為共享鎖和排他鎖 特點 開銷大,加鎖慢,會出現死鎖 鎖...