Are nested transactions supposed to work in 2.0.2?
We've read the docs on the wiki, but its not clear to us what is supposed
to work and how.
Here's a junit test case:
package com.vertex.orientdb;
import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx;
import com.orientechnologies.orient.core.record.impl.ODocument;
import com.orientechnologies.orient.core.sql.OCommandSQL;
import com.tinkerpop.blueprints.impls.orient.OrientGraphFactory;
import org.junit.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class UpgraderTest
{
private static final Logger log = LoggerFactory.getLogger(
UpgraderTest.class );
private ODatabaseDocumentTx db;
private OrientGraphFactory factory;
@Before
public void setUp() throws Exception
{
factory = new OrientGraphFactory( "memory:test", "admin", "admin" );
db = factory.getDatabase();
}
@After
public void tearDown() throws Exception
{
factory.close();
}
@Test
public void testTransactions() throws Exception
{
db.command( new OCommandSQL( "CREATE CLASS person" ) ).execute();
db.command( new OCommandSQL( "CREATE PROPERTY person.name string" )
).execute();
db.begin();
try
{
transactionalMethod1();
log.info( "5a - count: {}", db.countClass( "Person" ) );
}
catch( Exception e )
{
log.info( "5b - count: {}", db.countClass( "Person" ) );
db.rollback();
log.info( "5c - count: {}", db.countClass( "Person" ) );
}
}
public void transactionalMethod1()
{
log.info( "1 - count: {}", db.countClass( "Person" ) );
db.begin();
try
{
new ODocument( "person" ).field( "name", "Test1" ).save();
log.info( "2 - count: {}", db.countClass( "Person" ) );
transactionalMethod2();
db.commit();
}
catch( Exception e )
{
log.error( e.getMessage(), e );
log.info( "Rolling back in method1()" );
db.rollback();
throw e;
}
}
public void transactionalMethod2()
{
db.begin();
try
{
log.info( "3 - count: {}", db.countClass( "Person" ) );
new ODocument( "Person" ).field( "Name", "Test2" ).save();
log.info( "4 - count: {}", db.countClass( "Person" ) );
throw new RuntimeException( "" );
}
catch( Exception e )
{
db.rollback();
throw e;
}
}
}
Every log line prints out the count as 0 - none of the changes seem to be
visible in the callstack:
2015-02-13 20:02:57,297 INFO [main] <> com.vertex.orientdb.UpgraderTest -
1 - count: 0
2015-02-13 20:02:57,306 INFO [main] <> com.vertex.orientdb.UpgraderTest -
2 - count: 0
2015-02-13 20:02:57,307 INFO [main] <> com.vertex.orientdb.UpgraderTest -
3 - count: 0
2015-02-13 20:02:57,307 INFO [main] <> com.vertex.orientdb.UpgraderTest -
4 - count: 0
2015-02-13 20:02:57,308 ERROR [main] <> com.vertex.orientdb.UpgraderTest -
java.lang.RuntimeException:
at
com.vertex.orientdb.UpgraderTest.transactionalMethod2(UpgraderTest.java:85)
at
com.vertex.orientdb.UpgraderTest.transactionalMethod1(UpgraderTest.java:63)
at com.vertex.orientdb.UpgraderTest.testTransactions(UpgraderTest.java:43)
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:483)
at
org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at
org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at
org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
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:271)
at
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at
org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.junit.runner.JUnitCore.run(JUnitCore.java:160)
at
com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:74)
at
com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:211)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:67)
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:483)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
2015-02-13 20:02:57,314 INFO [main] <> com.vertex.orientdb.UpgraderTest -
Rolling back in method1()
2015-02-13 20:02:57,314 INFO [main] <> com.vertex.orientdb.UpgraderTest -
5b - count: 0
2015-02-13 20:02:57,315 INFO [main] <> com.vertex.orientdb.UpgraderTest -
5c - count: 0
Secondly, we're also seeing unexpected results related to rollback and the
timing of the rollback - rollbacks in nested transactions (which have
joined the parent/outer transaction) don't seem to be rolling back until
later than we expected (if at all)
Also, try this test case:
@Test
public void testTransactionalMethod5()
{
db.begin();
log.info( "0 - count: {}", db.countClass( "Person" ) );
addPerson( "test1" );
addPerson( "test2" );
db.commit();
log.info( "1 - count: {}", db.countClass( "Person" ) );
}
private void addPerson( String name )
{
db.begin();
log.info( "0 - count: {}", db.countClass( "Person" ) );
new ODocument( "Person" ).field( "Name", name ).save();
db.commit();
log.info( "1 - count: {}", db.countClass( "Person" ) );
}
We see this output:
2015-02-13 20:12:19,819 INFO [main] <> com.vertex.orientdb.UpgraderTest -
0 - count: 0
2015-02-13 20:12:19,828 INFO [main] <> com.vertex.orientdb.UpgraderTest -
0 - count: 0
2015-02-13 20:12:19,829 INFO [main] <> com.vertex.orientdb.UpgraderTest -
1 - count: 0
2015-02-13 20:12:19,830 INFO [main] <> com.vertex.orientdb.UpgraderTest -
0 - count: 0
2015-02-13 20:12:19,830 INFO [main] <> com.vertex.orientdb.UpgraderTest -
1 - count: 0
2015-02-13 20:12:19,834 INFO [main] <> com.vertex.orientdb.UpgraderTest -
1 - count: 2
The changes made in the first call to addPerson() dont seem visible in the
second call, so how would we do multi-step SQL executions in a
transactional manner where step 2 referenced stuff from step 1?
Nick
--
---
You received this message because you are subscribed to the Google Groups
"OrientDB" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.