gpt4 book ai didi

mysql - 通过 redisson 避免重复行

转载 作者:可可西里 更新时间:2023-11-01 11:27:58 25 4
gpt4 key购买 nike

我确实有一张 table ,Foo。我在某些事件中向该表添加行。当前的整体设计使得无法避免重复消息。这会导致向表中添加重复行。

我不能对表设置唯一约束,因为有不同类型的消息成为该表中的行。我只想避免重复特定类型的消息。

由于重复的消息经常同时出现,而且该应用程序运行在多个节点上,所以我决定使用 radisson 来获取分布式锁。但是它似乎没有用。我仍然在表格中得到重复的行。

根据用户 ID、日期和类型检测重复消息。下面是简约的演示代码。我正在尝试在写入之前进行读取,并且此读取发生在跨应用程序节点的同步块(synchronized block)中。

感谢对此的任何投入。

     if(updateEntry.getType().equals(Type.XYZ) {
java.sql.Date date = updateEntry.getDate();
String redisLockKey = "MyAPP" + "-" + userId+"-"+date.toString()+ "-" + "type-XYZ";
RLock rLock = redissonClient.getLock(redisLockKey);
rLock.lock(5, TimeUnit.SECONDS);
MyEntity myEntity = myEntityRepository.findByUserIdAndDateAndActivityType(userId,date,Type.XYZ);
if(null == myEntity) {
myEntity = new MyEntity();
// myEntity setters
myEntity = myEntityRepository.saveAndFlush(myEntity);
}
rLock.unlock();
}

最佳答案

我发现了问题。上面的代码块在@Transactional 中。使用 spring 默认隔离级别,它在 mysql 中是 REPEATABLE_READ。在事务之外获取锁解决了这个问题。

关于mysql - 通过 redisson 避免重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43982707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com