MySQL随机选取资源

发布时间:2020-08-10 15:12:19 作者:壹頁書
来源:ITPUB博客 阅读:140
随机选取一个资源
模拟表如下:
  1. create table room_info(  
  2.     RoomID bigint not null auto_increment comment '房间ID',  
  3.     State smallint not null default 1 comment '状态.1表示空闲,2表示被占用',  
  4.     primary key(RoomID)  
  5. ) ;  
  6.   
  7. INSERT INTO `room_info` (`RoomID`,`State`) VALUES (1,1);  
  8. INSERT INTO `room_info` (`RoomID`,`State`) VALUES (2,1);  
  9. INSERT INTO `room_info` (`RoomID`,`State`) VALUES (3,1);  
  10. INSERT INTO `room_info` (`RoomID`,`State`) VALUES (4,1);  
  11. INSERT INTO `room_info` (`RoomID`,`State`) VALUES (5,1);  
  12. INSERT INTO `room_info` (`RoomID`,`State`) VALUES (6,1);  
  13. INSERT INTO `room_info` (`RoomID`,`State`) VALUES (7,1);  
  14. INSERT INTO `room_info` (`RoomID`,`State`) VALUES (8,1);  
  15. INSERT INTO `room_info` (`RoomID`,`State`) VALUES (9,1);  
  16. INSERT INTO `room_info` (`RoomID`,`State`) VALUES (10,1);  
  17. INSERT INTO `room_info` (`RoomID`,`State`) VALUES (11,1);  
  18. INSERT INTO `room_info` (`RoomID`,`State`) VALUES (12,1);  
  19. INSERT INTO `room_info` (`RoomID`,`State`) VALUES (13,1);  
  20. INSERT INTO `room_info` (`RoomID`,`State`) VALUES (14,1);  
  21. INSERT INTO `room_info` (`RoomID`,`State`) VALUES (15,1);  
  22. INSERT INTO `room_info` (`RoomID`,`State`) VALUES (16,1);  
  23. INSERT INTO `room_info` (`RoomID`,`State`) VALUES (17,1);  
  24. INSERT INTO `room_info` (`RoomID`,`State`) VALUES (18,1);  
  25. INSERT INTO `room_info` (`RoomID`,`State`) VALUES (19,1);  
  26. INSERT INTO `room_info` (`RoomID`,`State`) VALUES (20,1);  

从资源表中随机选取一个资源,并且修改状态.
资源表的记录不多,大致1w行左右.

创建普通索引
create index inx_1 on room_info(roomid,state);

这个索引非常重要
如果没有这个索引,可能会锁多行.

随机获取一行,并且修改资源状态.
  1. set autocommit=false;  
  2. update room_info set state=2 where RoomID=(  
  3.     select * from (  
  4.         select RoomID from room_info where state=1 order by rand() limit 1  
  5.     ) a  
  6. and state=1 and @roomid:=roomid;  
  7. select @roomid;  
  8. commit;  

需要注意的是,在执行下面SQL的时候,没有上锁.
select RoomID from room_info where state=1 order by rand() limit 1
所以在多线程环境下,可能冲突.
所以需要判断 update 的影响行数.如果影响行数为0,说明资源已经被别人锁定.自己需要重新获取.
MySQL随机选取资源

如果影响行数为0,此时切记不能拿到@roomid直接使用,而是需要重新运行.
推荐阅读:
  1. 什么是mysql默认随机密码
  2. Mysql无法选取非聚合列怎么办

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

mysql 资源 选取

上一篇:dataguard主备延迟多长时间的2种查询方法

下一篇:用python写程序的方法

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》