創建普通索引 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,說明資源已經被別人鎖定.自己需要重新獲取.