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
Uh oh!
There was an error while loading. Please reload this page.
-
场景
生产中多实例分布式部署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