MySQL随机选取资源
发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,随机选取一个资源模拟表如下:create table room_info(RoomID bigint not null auto_increment comment '房间ID',State smal
千家信息网最后更新 2025年01月20日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安全错误
数据库的锁怎样保障安全
网络安全校园主题日班会
韩国服务器安全吗
省政府服务器监控
前锦网络技术科技有限公司
成都软件开发操作
虹口区网络技术咨询价格对比
江西智慧团建软件开发系统
私有云比自己买服务器性价比高吗
杭州无舆网络技术有限公司
北信源中国网络安全能力图谱
WOW数据库技术员
公安局净化全县网络安全
服务器同时连接内外网
国家安全体系的网络安全
mcyc服务器密码
语音聊天软件开发费用标准
软件开发平台下载
供应网络视频服务器公司
和龙软件开发设计
数据库导出 数字被转换
软件开发人员 微信
金融信用数据库
德州网络安全保卫支队高杨
pyqt5连接和显示数据库
网络安全攻防演练 方案
php对数据库连接进行封装
数据通信与网络技术心得体会
软件开发平台下载
网络安全问题实践内容
宽带连接服务器没有响应怎么办