首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过redisson避免重复行

通过redisson避免重复行
EN

Stack Overflow用户
提问于 2017-05-15 22:58:59
回答 2查看 214关注 0票数 1

我确实有一张桌子,福。我在此表中添加特定事件的行。当前的总体设计是无法避免重复消息的。这会导致向表中添加重复的行。

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

由于重复的消息通常是并发的,并且该应用程序在多个节点上运行,因此我决定使用radisson来获取分布式锁。然而,它似乎不起作用。我仍然在表中得到重复的行。

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

感谢您对此的任何意见。

代码语言:javascript
运行
复制
     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();
     }
EN

回答 2

Stack Overflow用户

发布于 2017-05-16 23:14:43

我找到问题了。上面的代码块位于@Transactional内部。使用spring默认隔离级别时,它在mysql上是REPEATABLE_READ。在事务之外获取锁解决了这个问题。

票数 0
EN

Stack Overflow用户

发布于 2017-06-22 02:58:44

代码语言:javascript
运行
复制
MyEntity myEntity = myEntityRepository.findByUserIdAndDateAndActivityType(userId,date,Type.XYZ);
if(null == myEntity) {
   myEntity = new MyEntity();
   // myEntity setters
   myEntity = myEntityRepository.saveAndFlush(myEntity);
}

根据这部分代码,您将userId、date和type作为唯一标准来决定是否可以插入此记录。那么你能解释一下为什么你不能把它们作为一个组合的唯一约束组合在一起吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43982707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档