Hi Could you please explain your use case why you would like to use nested transactions?
~nagu. On Monday, March 16, 2015 at 11:40:05 PM UTC+5:30, kurtuluş yılmaz wrote: > > Hi Nick; > Did you find any solution for your problem also I have same problem. I try > to update graphdb and documentDb but I fail. OrientDb does not support > nested transactions but there should be a way to update document and graph > in same atomic operation. If there is no wat how we say OrientDb has ACID. > > http://www.orientechnologies.com/docs/last/orientdb.wiki/Document-Database.html > "Transactions are managed at the database level. Nested transactions are > currently not supported. A database instance can only have one transaction > running." > Best regards. > > 13 Şubat 2015 Cuma 22:15:08 UTC+2 tarihinde Nick Pratt yazdı: >> >> 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.
