2015-09-18 1 views
3

J'utilise Embedded JavaAPI pour mon application en temps réel. Pendant qu'une transaction est verrouillée la base de données mon autre appel ajax jette l'erreur que l'instance DB a été verrouillée par un autre processus. La plupart du temps, mes appels sont en lecture seule. Donc ma question est: Y at-il une méthode existe dans JavaAPI Neo4J afin que je puisse verrouiller ma transaction en lecture seule afin que l'autre demande puisse obtenir des données à partir de DB.Neo4j transaction locking

dbFactory = new GraphDatabaseFactory(); 
 
db= dbFactory.newEmbeddedDatabase(DB_PATH); 
 
tx = db.beginTx();

donc à ce db.beginTx() je peux dire que ce Neo4j est un mode de lecture seule ou quelque chose comme ça.

Merci,

+0

Peut-être que vous pouvez mettre à jour votre question avec Exception stacktrace (et message). Cela sera utile pour repérer le problème. – FylmTM

+0

seules les transactions ne prennent pas de verrous, seules les transactions d'écriture le font. Le type de tx est déterminé automatiquement. –

+0

@MichaelHunger Qu'en est-il du cas où deux servlets s'exécutent pour la même base de données et interrogent la même base de données dans les deux servlets. J'ai le code ci-dessus dans les deux. –

Répondre

5

Malheureusement, il n'existe pas une telle méthode. Mais, en fait - ce n'est pas nécessaire.

Neo4j locking behaviour

verrous en lecture: ils sont "partagés". Si une transaction lit des données à partir d'un nœud, alors une autre transaction peut le faire également. Ecrire des verrous: ils sont "exclusifs". Lorsque le verrouillage d'écriture est pris, toutes les transactions attendront jusqu'à ce que ce verrou soit relâché et seulement ensuite continuer plus loin. Si une autre transaction a un noeud Read lock on, le verrouillage en écriture attendra jusqu'à ce que ce noeud soit "libre".

Normalement, vous ne devriez recevoir aucune erreur.

Il est possible d'obtenir DeadlockException (more info), mais c'est rare. Si vous n'utilisez pas vos propres méthodes de synchronisation, vous ne verrez pas de telles exceptions.

EDIT:

Vous devez vous assurer que vous avez seulement un instance de GraphDatabaseService dans votre application. L'instance DB est complètement threadsafe.

+0

Il jette ** Exception dans le fil "principal" java.lang.IllegalStateException: Impossible de verrouiller magasin [], cela est généralement le résultat d'un autre noyau Neo4j en cours d'exécution en utilisant le même magasin. ** –

+0

Answer edited. Vérifiez que vous créez une instance de base de données une seule fois. – FylmTM

+0

Vous ne devez pas exécuter plusieurs instances de base de données sur les mêmes fichiers de stockage. –