MySQL随机选取资源
发表于:2025-02-23 作者:千家信息网编辑
千家信息网最后更新 2025年02月23日,随机选取一个资源模拟表如下:create table room_info(RoomID bigint not null auto_increment comment '房间ID',State smal
千家信息网最后更新 2025年02月23日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安全错误
数据库的锁怎样保障安全
基因数据库数据从哪里来
网络安全问题的基本原因
214网络安全事件是哪家医院
nginx 下载服务器
关于网络安全有话说
北京质量软件开发科技
新型网络安全体系结构
漳州医保网络安全要求
服务器接入端口有哪些
服务器 连接 局域网
网络安全对我们有什么作用
软件开发如何记固定资产
部队网络安全的重要性
万方数据库名称是什么
考生网络安全
网络安全下什么
网络安全策略配置原则
网络安全读后感100字
狡兔虚拟助手服务器异常
数据库最多能插多少条记录
柏林数据库
mysql数据库互斥锁
简述防范网络安全应该注意什么
伊犁网络技术推荐厂家
墨西哥网络安全
fm2017.34数据库
高保真 软件开发
2018年数据库资料
外文数据库检索词的表达
部门属性数据库设计