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隨機
- 【API】隨機獲取圖片API隨機
- Django Models隨機獲取指定數量資料方法Django隨機
- mysql 隨機查詢記錄MySql隨機
- 基於隨機定位的地圖資訊獲取方式隨機地圖
- 如何用計算機電源竊取機密資料?計算機
- jQuery雙色器隨機選號jQuery隨機
- 天坑,這樣一個lambda隨機取資料也有Bug隨機
- Golang 開源庫分享:faker - 隨機生成有趣的假資料!Golang隨機
- 開源神器:自動生成隨機 mock 資料測試物件隨機Mock物件
- 基於序列模型的隨機取樣模型隨機
- Java從List中獲取隨機元素Java隨機
- JavaScript隨機數實現防止快取JavaScript隨機快取
- mysql迴圈插入資料、生成隨機數及CONCAT函式MySql隨機函式
- 前端,java,mysql,nginx,簡歷 獲取免費學習資源!!!前端JavaMySqlNginx
- 解讀MySQL 8.0資料字典快取管理機制MySql快取
- 【MySQL】MHA原始碼之主庫選取(二)MySql原始碼
- java獲取時間戳和隨機數Java時間戳隨機
- 從Linux核心中獲取真隨機數Linux隨機
- [玩轉MySQL之四]MySQL快取機制MySql快取
- 【Python小隨筆】 SSH 獲取資訊Python
- MySQL隨筆MySql
- MySQL 隨筆MySql
- MySQL 資料庫技巧:批次更新隨機生成的時間戳欄位MySql資料庫隨機時間戳
- ArcGIS如何自動獲得隨機取樣點?隨機
- python爬蟲從ip池獲取隨機IPPython爬蟲隨機
- Java之獲取隨機數的4種方法Java隨機
- Scrapy使用隨機User-Agent爬取網站隨機網站
- python讀取MySQL資料PythonMySql
- Spark讀取MySQL資料SparkMySql
- Jsp讀取MySQL資料JSMySql
- 獲取當前時間戳和隨機數的獲取、Java Random、ThreadLocalRandom、UUID類中的方法應用(隨機數)時間戳隨機JavarandomthreadUI
- golang 介面按需獲取資源Golang
- Node讀取靜態資源
- Python中的隨機取樣和概率分佈(一)Python隨機概率分佈
- Python中的隨機取樣和概率分佈(二)Python隨機概率分佈
- JavaScript 獲取0-1之間的隨機數JavaScript隨機
- Mysql批量大資料獲取MySql大資料