"it's said that ZooKeeper has a transaction mechanism” I’m still confused with this. ZooKeeper doesn’t support transactions to my best knowledge. It has a `multi` operation feature, but that’s more like a bulk operation, not transaction.
"I want to tell ZooKeeper that the check and setData should be successful” I don’t think you can do that. ZK has no check-and-set support either. Maybe we should step back first and see what’s your use case exactly that you’re trying to solve with ZooKeeper. I suspect that you’re trying to follow the wrong approach or misusing ZooKeeper. Have you checked our tutorial and recipes page? You can find some recommended usage patterns: https://zookeeper.apache.org/doc/r3.5.5/recipes.html https://zookeeper.apache.org/doc/r3.5.5/zookeeperTutorial.html If that’s not enough, you could also try Curator which has even more built-in high level functionalities on top of basic ZK commands. Andor > On 2019. Aug 14., at 17:52, Zili Chen <wander4...@gmail.com> wrote: > > Hi Andor, > > Thanks for your attention. > > The problem is that in concurrent scenario zk.setData() could still failed > if there is another thread delete the node. I know with proper lock strategy > and ownership separation this can be avoid but it's said that ZooKeeper has > a transaction mechanism so I'd like to see whether I can make use of it. > > There is where I turn to > > zk.multi(Op.check(path1), Op.setData(path2, data)); // path1 == or != path2 > is irrelevant > > when the existence of a mark node(path1) guarded a condition and I want to > make > sure that setData successes only if the mark node exist. If I check the > existence > first and commit setData, a remove to the node could break the guard. In > other > words, I want to tell ZooKeeper that the check and setData should be > successful > committed or fail to be committed atomically. > > Best, > tison. > > > Andor Molnar <an...@apache.org> 于2019年8月14日周三 下午11:12写道: > >> Hi Zili, >> >> There’s no such functionality in ZooKeeper as far as I’m concerned. I >> think your multi example (zk.multi(Op.check(path), Op.setData(path, data))) >> is already a usage pattern which multi is not designed to support. >> >> Why do you need to do this in “transactions” (there’s no transaction in >> ZK)? >> >> In Java you can do: >> >> try { >> zk.create(); >> } catch (NodeExistsException e) { >> // swallow exception >> } >> zk.setData(); >> … >> >> Regards, >> Andor >> >> >> >> >>> On 2019. Aug 6., at 14:44, Zili Chen <wander4...@gmail.com> wrote: >>> >>> Hi Enrico, >>> >>> Thanks for your reply. >>> >>>> In this case usually you use conditional setData, using the 'version' of >>>> thr znode >>> >>> >>> what if the caller has no idea on whether the node exist?(see also >>> my if-else pseudo-code above.) >>> >>> IIRC if we call `setData` on a non-exist path a NoNodeException >>> will be thrown. >>> Best, >>> tison. >>> >>> >>> Enrico Olivelli <eolive...@gmail.com> 于2019年8月6日周二 下午8:27写道: >>> >>>> Il mar 6 ago 2019, 13:47 Zili Chen <wander4...@gmail.com> ha scritto: >>>> >>>>> Any ideas? >>>>> >>>>> >>>>> Zili Chen <wander4...@gmail.com> 于2019年7月29日周一 上午11:12写道: >>>>> >>>>>> Hi ZooKeepers, >>>>>> >>>>>> Currently our transaction mechanism supports doing >>>>>> create/setData/checkExist/delete in transaction. However, taking this >>>>>> scenario into consideration, we want to put data in path "/path" but >>>>>> don't know whether the znode exists or not. Let's say we program as >>>>>> below >>>>>> >>>>>> if (zk.exist(path)) { >>>>>> zk.setData(path, data); >>>>>> } else { >>>>>> zk.create(path, data); >>>>>> } >>>>> >>>> >>>> Do you need to perform other ops in the same transaction? >>>> In this case usually you use conditional setData, using the 'version' of >>>> thr znode >>>> >>>> >>>> Enrico >>>> >>>>> >>>>>> if we want to do the check and "put" in transaction, it would be like >>>>>> >>>>>> zk.multi(Op.check(path), Op.setData(path, data)); >>>>>> >>>>>> but we cannot add a "else" branch. ZooKeeper's transaction would all >>>>>> success or fail. >>>>>> >>>>>> Is there any way to do an "if-else" transaction? >>>>>> >>>>>> Best, >>>>>> tison. >>>>>> >>>>> >>>> >> >>