这是用例:
我的桌子上有一堆可用的或不可用的唯一代码.作为事务的一部分,我想从表中选择一个可用的代码,然后稍后在事务中更新该行.由于这可以同时在许多会话中同时发生,因此我希望理想地选择随机记录并在表上使用行级锁定,以便其他事务不会被从中选择行的查询阻止桌子.
我正在使用InnoDB作为存储引擎,而我的查询如下所示:
select * from tbl_codes where available = 1 order by rand() limit 1 for update
但是,它不仅锁定了表的一行,而且最终锁定了整个表.任何人都可以给我一些如何做到这一点的指示,以便该查询不会锁定整个表,而只会锁定行?
更新资料
附录:通过在我的选择中指定显式键而不是rand(),我能够实现行级锁定.当我的查询如下所示:
查询1:
select * from tbl_codes where available = 1 and id=5 limit 1 for update
查询2:
select * from tbl_codes where available = 1 and id=10 limit 1 for update
但是,这并不能真正解决问题.
附录2:我所使用的最终解决方案
鉴于rand()在MySQL中存在一些问题,我选择的策略是:
>我选择50个可用的代码ID = 1,然后在应用程序层中对数组进行混洗以向订单添加一定程度的随机性.
从tbl_codes中选择可用的ID = 1个限制50
>我开始从随机播放的数组中循环弹出代码,直到能够选择一个带有锁的代码为止
从tbl_codes中选择*,如果可用= 1并且id =:id