当前使用版本(必填,否则不予处理)

3.4.3.4

该问题是如何引起的?(确定最新版也有问题再提!!!)

重现步骤(如果有就写完整)

IPage findUnsentMessagesSkipLocked(IPage page); mapper中写sql: select * from table for update 最后拼出的sql是: select * from table for update limit 10

limit的位置不对,会报语法错误,正确的应该是在for update前面 select * from table limit 10 for update

报错信息

Comment From: miemieYaho

分页数据还加锁?

Comment From: jimmy384

是的,有什么问题?

Comment From: jimmy384

@miemieYaho 补充一下细节,回答一下你的疑问"分页数据还要加锁?" 试了一下一个事务for update后,即使分页了也会锁住全部,另外一个事务会卡住,确实好像是没什么意义。

但是mysql8有个新特性FOR UPDATE SKIP LOCKED,锁不住的时候会马上返回 假设表有10行数据 事务1先执行 SELECT * FROM base_goods LIMIT 8 FOR UPDATE SKIP LOCKED; 拿到8行数据, 只锁住8行

事务2后执行 SELECT * FROM base_goods LIMIT 8 FOR UPDATE SKIP LOCKED; 10 - 8 = 2,这里会拿到2条数据,不会卡住

我是想做到这个效果

Comment From: jimmy384

想了想,其实没必要传分页对象进去, 直接传个(int batchSize)就行了 SELECT * FROM base_goods LIMIT #{batchSize}