MySQL随机选取资源
发表于:2025-11-06 作者:千家信息网编辑
千家信息网最后更新 2025年11月06日,随机选取一个资源模拟表如下:create table room_info(RoomID bigint not null auto_increment comment '房间ID',State smal
千家信息网最后更新 2025年11月06日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安全错误
数据库的锁怎样保障安全
主机连接服务器延迟吗
ibm服务器价格
安全时间同步服务器地址
数据库中id与表不匹配
没有网络安全就
资源型服务器
网络安全bbs
上海顺高互联网科技
福建省网络安全与密码学
网络安全宣传密码
湖北升腾服务器价钱
数据库名表名字段名是什么
源文鉴的数据库和知网的一样吗
学网络技术做什么工作
上海紫山互联网科技
软件开发公务员职位招聘信息
服务器事件视频教程
北京房山区网络安全培训
物理服务器知识
数据库设计公众号
木鱼服务器
git 软件开发版本管理
淄川库存管理软件开发
适合存储图片的数据库
天津塘沽区临床试验数据库
漫灵软件开发
hp服务器售后服务
wow新服务器
新时期依法完善网络安全体系
东莞卫星软件开发供应商家