MySQL随机选取资源
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,随机选取一个资源模拟表如下:create table room_info(RoomID bigint not null auto_increment comment '房间ID',State smal
千家信息网最后更新 2026年10月31日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直接使用,而是需要重新运行.
资源
状态
索引
影响
普通
重要
一行
房间
时候
环境
空闲
线程
而是
多行
冲突
运行
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网科技公司
关于新基建和互联网科技
深圳互联网科技公司
青岛互联网科技公司
小马过河互联网科技
互联网科技logo设计
唐信互联网科技 大连
广西互联网科技公司
长亮科技互联网金融
卓越科技互联网 招聘
福州新华互联网科技学校 知乎
港股科技和互联网
互联网5g黑科技有哪些
互联网科技圈年度人物
国大互联网教育科技有限公司薪资
互联网科技快讯热点
绵阳真晨互联网科技有限公司
恒生科技指数 中概互联网
科技互联网企业在行动
前海云享互联网科技
广州百单互联网科技有限公司
科技股互联网
互联网科技保险
盈实互联网科技
猫创互联网科技
深圳艾佳互联网科技
互联网时代科技改变生活
苏州五指互联网络科技有限
梅州GM互联网络科技有限公司
上海乐五互联网科技有限公司