Replies: 1 comment 5 replies
-
PreAcquireNamespaceLock 是用来实现 namespace.lock.switch 功能的,不是用来解决并发写入的问题。 |
Beta Was this translation helpful? Give feedback.
5 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
场景
生产中多实例分布式部署adminservice,并发请求添加同一Item,数据库中存在两个相同namespaceId,Key,IsDeleted=0的Item数据,导致无法删除该Key,报错为query did not return a unique result:2。
问题定位过程
首先注意到item的CURD操作中都会先去判断数据库中是否存在相同的Item,那么高并发情况下一定会出问题
之后看到到方法声明上都添加了@PreAcquireNamespaceLock注解,具体到tryLock方法中看到,加锁是根据namespaceId来加锁,且mysql表中该字段加了唯一索引
最后感觉到疑问,在tryLock失败时 catch中的checkLock逻辑,如果使用相同user的两个实例并发加锁请求,实例1加锁成功,实例2加锁失败,但catch中调用checkLock方法时,检查发现user与lock表中的user相同,那么也会加锁成功?
请问是否存在这种情况?如果存在如何避免?新人小白,期待解答:)
Beta Was this translation helpful? Give feedback.
All reactions