Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Default transaction is not cleared from thread local when the query fails #393

Closed
frant-hartm opened this issue Aug 28, 2017 · 0 comments
Closed

Comments

@frant-hartm
Copy link
Contributor

When a default transaction fails (e.g. because of constraint violation) it is not cleared from threadlocal, subsequent calls to the session fail with transaction already closed.

org.neo4j.ogm.exception.CypherException: Error executing Cypher; Code: N/A; Description: Cannot run more statements in this transaction, because previous statements in the transaction has failed and the transaction has been rolled back. Please start a new transaction to run another statement.

	at org.neo4j.ogm.drivers.bolt.request.BoltRequest.executeRequest(BoltRequest.java:164)
	at org.neo4j.ogm.drivers.bolt.request.BoltRequest.execute(BoltRequest.java:70)
	at org.neo4j.ogm.session.delegates.LoadOneDelegate.load(LoadOneDelegate.java:72)
	at org.neo4j.ogm.session.delegates.LoadOneDelegate.load(LoadOneDelegate.java:49)
	at org.neo4j.ogm.session.Neo4jSession.load(Neo4jSession.java:155)
	at org.neo4j.ogm.persistence.transaction.DefaultTransactionTest.shouldBeAbleToUseSessionAfterDefaultTransactionFails(DefaultTransactionTest.java:77)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
	at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
	at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
	at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: org.neo4j.driver.v1.exceptions.ClientException: Cannot run more statements in this transaction, because previous statements in the transaction has failed and the transaction has been rolled back. Please start a new transaction to run another statement.
	at org.neo4j.driver.internal.ExplicitTransaction.ensureNotFailed(ExplicitTransaction.java:220)
	at org.neo4j.driver.internal.ExplicitTransaction.run(ExplicitTransaction.java:188)
	at org.neo4j.driver.internal.ExplicitTransaction.run(ExplicitTransaction.java:162)
	at org.neo4j.driver.internal.ExplicitTransaction.run(ExplicitTransaction.java:175)
	at org.neo4j.ogm.drivers.bolt.request.BoltRequest.executeRequest(BoltRequest.java:156)
	... 30 more

Expected Behavior

The transaction should be cleared from the thread local.

The exception should be re-thrown.

The thrown exception should be same for all drivers.

The session should be usable after the exception.

The session context should contain correct data.

Current Behavior

Possible Solution

Issue is in org.neo4j.ogm.session.request.RequestExecutor#executeSave(org.neo4j.ogm.cypher.compiler.CompileContext, boolean)

It creates a new transaction when there is none, but then it does not handle the failure case.

Steps to Reproduce (for bugs)

See test case.

Context

Your Environment

  • OGM Version used: 3.0.0-SNAPSHOT
  • Java Version used: 1.8
  • Neo4J Version used: 3.2.3
  • Bolt Driver Version used (if applicable):1.4
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant