MySQL隨機選取資源
隨機選取一個資源
模擬表如下:
從資源表中隨機選取一個資源,並且修改狀態.
資源表的記錄不多,大致1w行左右.
建立普通索引
create index inx_1 on room_info(roomid,state);
這個索引非常重要
如果沒有這個索引,可能會鎖多行.
隨機獲取一行,並且修改資源狀態.
需要注意的是,在執行下面SQL的時候,沒有上鎖.
select RoomID from room_info where state=1 order by rand() limit 1
所以在多執行緒環境下,可能衝突.
所以需要判斷 update 的影響行數.如果影響行數為0,說明資源已經被別人鎖定.自己需要重新獲取.
如果影響行數為0,此時切記不能拿到@roomid直接使用,而是需要重新執行.
模擬表如下:
- create table room_info(
- RoomID bigint not null auto_increment comment '房間ID',
- State smallint not null default 1 comment '狀態.1表示空閒,2表示被佔用',
- primary key(RoomID)
- ) ;
- INSERT INTO `room_info` (`RoomID`,`State`) VALUES (1,1);
- INSERT INTO `room_info` (`RoomID`,`State`) VALUES (2,1);
- INSERT INTO `room_info` (`RoomID`,`State`) VALUES (3,1);
- INSERT INTO `room_info` (`RoomID`,`State`) VALUES (4,1);
- INSERT INTO `room_info` (`RoomID`,`State`) VALUES (5,1);
- INSERT INTO `room_info` (`RoomID`,`State`) VALUES (6,1);
- INSERT INTO `room_info` (`RoomID`,`State`) VALUES (7,1);
- INSERT INTO `room_info` (`RoomID`,`State`) VALUES (8,1);
- INSERT INTO `room_info` (`RoomID`,`State`) VALUES (9,1);
- INSERT INTO `room_info` (`RoomID`,`State`) VALUES (10,1);
- INSERT INTO `room_info` (`RoomID`,`State`) VALUES (11,1);
- INSERT INTO `room_info` (`RoomID`,`State`) VALUES (12,1);
- INSERT INTO `room_info` (`RoomID`,`State`) VALUES (13,1);
- INSERT INTO `room_info` (`RoomID`,`State`) VALUES (14,1);
- INSERT INTO `room_info` (`RoomID`,`State`) VALUES (15,1);
- INSERT INTO `room_info` (`RoomID`,`State`) VALUES (16,1);
- INSERT INTO `room_info` (`RoomID`,`State`) VALUES (17,1);
- INSERT INTO `room_info` (`RoomID`,`State`) VALUES (18,1);
- INSERT INTO `room_info` (`RoomID`,`State`) VALUES (19,1);
- INSERT INTO `room_info` (`RoomID`,`State`) VALUES (20,1);
從資源表中隨機選取一個資源,並且修改狀態.
資源表的記錄不多,大致1w行左右.
建立普通索引
create index inx_1 on room_info(roomid,state);
這個索引非常重要
如果沒有這個索引,可能會鎖多行.
隨機獲取一行,並且修改資源狀態.
- set autocommit=false;
- update room_info set state=2 where RoomID=(
- select * from (
- select RoomID from room_info where state=1 order by rand() limit 1
- ) a
- ) and state=1 and @roomid:=roomid;
- select @roomid;
- commit;
需要注意的是,在執行下面SQL的時候,沒有上鎖.
select RoomID from room_info where state=1 order by rand() limit 1
所以在多執行緒環境下,可能衝突.
所以需要判斷 update 的影響行數.如果影響行數為0,說明資源已經被別人鎖定.自己需要重新獲取.
如果影響行數為0,此時切記不能拿到@roomid直接使用,而是需要重新執行.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-2120294/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL隨機選取資源--優化MySql隨機優化
- 如何實現MySQL隨機查詢資料與MySQL隨機更新資料?MySql隨機
- 表中隨機取資料隨機
- 隨機選組隨機
- MySQL用隨機資料填充表MySql隨機
- Mysql取隨機資料效率測試(400W條中讀取100條)MySql隨機
- MySQL 隨機查詢資料與隨機更新資料實現程式碼MySql隨機
- oracle隨機取樣Oracle隨機
- js隨機從陣列中取資料JS隨機陣列
- mysql生成隨機數MySql隨機
- PHP獲取隨機數PHP隨機
- Random獲取隨機數random隨機
- 隨機取表記錄隨機
- 從oracle表中隨機取記錄,產生隨機數和隨機字串Oracle隨機字串
- SQL語句select隨機調取10行資料 Access/SQL Server/Mysql等資料庫隨機ServerMySql資料庫
- MySQL如何選擇隨機記錄?有好幾種方式呢!MySql隨機
- MySQL 用隨機資料填充外來鍵表MySql隨機
- php實現mysql資料庫隨機重排例子PHPMySql資料庫隨機
- 【API】隨機獲取圖片API隨機
- Oracle取隨機數函式Oracle隨機函式
- 面試中常問的有關隨機選取k個數的總結面試隨機
- mysql實現隨機查詢MySql隨機
- mysql 隨機查詢記錄MySql隨機
- Django Models隨機獲取指定數量資料方法Django隨機
- java 無重複取隨機數Java隨機
- MATLAB獲取隨機數——randMatlab隨機
- jQuery雙色器隨機選號jQuery隨機
- 如何用計算機電源竊取機密資料?計算機
- 天坑,這樣一個lambda隨機取資料也有Bug隨機
- 開源神器:自動生成隨機 mock 資料測試物件隨機Mock物件
- 基於序列模型的隨機取樣模型隨機
- Java從List中獲取隨機元素Java隨機
- JavaScript隨機數實現防止快取JavaScript隨機快取
- js從陣列隨機取一個資料程式碼例項JS陣列隨機
- MySQL與PostgreSQL:該選擇哪個開源資料庫?MySql資料庫
- MySQL取得某一範圍隨機數MySql隨機
- oracle插入隨機資料Oracle隨機
- java獲取時間戳和隨機數Java時間戳隨機