mysql 行级锁定_MySQL:如何实现行级事务锁定而不是表锁定

这是用例:

我的桌子上有一堆可用的或不可用的唯一代码.作为事务的一部分,我想从表中选择一个可用的代码,然后稍后在事务中更新该行.由于这可以同时在许多会话中同时发生,因此我希望理想地选择随机记录并在表上使用行级锁定,以便其他事务不会被从中选择行的查询阻止桌子.

我正在使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值