我确实有一张桌子,福。我在此表中添加特定事件的行。当前的总体设计是无法避免重复消息的。这会导致向表中添加重复的行。
我不能对该表施加唯一约束,因为在该表中有不同类型的消息成为行。我只想避免重复特定类型的消息。
由于重复的消息通常是并发的,并且该应用程序在多个节点上运行,因此我决定使用radisson来获取分布式锁。然而,它似乎不起作用。我仍然在表中得到重复的行。
根据userId、日期和类型检测重复消息。下面是简约的演示代码。我正在尝试在写入之前进行读取,该读取发生在跨应用程序节点的同步块中。
感谢您对此的任何意见。
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();
}发布于 2017-05-16 23:14:43
我找到问题了。上面的代码块位于@Transactional内部。使用spring默认隔离级别时,它在mysql上是REPEATABLE_READ。在事务之外获取锁解决了这个问题。
发布于 2017-06-22 02:58:44
MyEntity myEntity = myEntityRepository.findByUserIdAndDateAndActivityType(userId,date,Type.XYZ);
if(null == myEntity) {
myEntity = new MyEntity();
// myEntity setters
myEntity = myEntityRepository.saveAndFlush(myEntity);
}根据这部分代码,您将userId、date和type作为唯一标准来决定是否可以插入此记录。那么你能解释一下为什么你不能把它们作为一个组合的唯一约束组合在一起吗?
https://stackoverflow.com/questions/43982707
复制相似问题