创建普通索引 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 orderby 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,说明资源已经被别人锁定.自己需要重新获取.