That's definitely not the intended behavior. Given that you're using a third-party library to handle rollback, can you take a look at the code to see what it's doing on exception?
http://code.google.com/appengine/docs/java/datastore/transactions.html Does this happen with the low-level API? -- Ikai Lan Developer Programs Engineer, Google App Engine plus.ikailan.com | twitter.com/ikai On Tue, Aug 2, 2011 at 1:35 AM, Miroslav Genov <mge...@gmail.com> wrote: > Hello, > > The data appears to be added in the database, after transaction is rolled > back. Here are some logs and traces from the log to explain what I mean: > > > > > 1. > > 2011-08-02 10:29:53.579 > > > com.evo.adm.contract.server.billing.payment.RealPaymentProcessor > getBillDetails: Bill > Key:ContractEntity("1478445")/BillEntity("147844510771988481584792271109360773021467817511312270193553") > > 2. I2011-08-02 10:29:53.585 > > > com.evo.adm.accounting.server.PersistenceAccountBase findAccountByOwner: > CertificateEntity found 1 > > 3. I2011-08-02 10:29:53.603 > > > com.opengrapes.common.TimeLogger resetAndLog: Making Transaction executed > in: 24 ms > > 4. I2011-08-02 10:29:53.604 > > > com.opengrapes.common.TimeLogger resetAndLog: Generating Receipt executed > in: 1 ms > > 5. I2011-08-02 10:29:53.686 > > > com.opengrapes.common.TimeLogger resetAndLog: Saving Receipt executed in: > 82 ms > > 6. I2011-08-02 10:29:53.692 > > > com.opengrapes.common.TimeLogger resetAndLog: Print Receipt executed in: 6 > ms > > 7. E2011-08-02 10:30:00.805 > > > org.datanucleus.transaction.Transaction commit: Operation commit failed on > resource: org.datanucleus.store.appengine.DatastoreXAResource@19881f0, error > code UNKNOWN and transaction: [DataNucleus Transaction, ID=Xid= > > 8. E2011-08-02 10:30:00.807 > > > > com.evo.adm.contract.server.billing.payment.ProcessPaymentOrderActionHandler > handle: Transaction rolled back due to failure during commit > javax.jdo.JDOException: Transaction rolled back due to failure during > commit > at > org.datanucleus.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:419) > at org.datanucleus.jdo.JDOTransaction.commit(JDOTransaction.java:132) > at > org.datanucleus.store.appengine.jdo.DatastoreJDOTransaction.commit(DatastoreJDOTransaction.java:56) > at > com.wideplay.warp.persist.jdo.JdoLocalTxnInterceptor.invoke(JdoLocalTxnInterceptor.java:68) > at > com.google.inject.internal.InterceptorStackCallback$InterceptedMethodInvocation.proceed(InterceptorStackCallback.java:64) > at > com.google.inject.internal.InterceptorStackCallback.intercept(InterceptorStackCallback.java:44) > at > com.evo.adm.contract.server.billing.payment.RealPaymentProcessor$$EnhancerByGuice$$50b371d5.chargeOrder(<generated>) > at > com.evo.adm.contract.server.billing.payment.ProcessPaymentOrderActionHandler.handle(ProcessPaymentOrderActionHandler.java:95) > at > com.evo.adm.contract.server.billing.payment.ProcessPaymentOrderActionHandler.handle(ProcessPaymentOrderActionHandler.java:35) > at > com.evo.gad.dispatch.DefaultActionDispatcher.dispatch(DefaultActionDispatcher.java:41) > at > com.evo.adm.communication.server.rpc.RpcServiceImpl.execute(RpcServiceImpl.java:134) > at sun.reflect.GeneratedMethodAccessor70.invoke(Unknown Source) > at > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > at java.lang.reflect.Method.invoke(Method.java:616) > at > com.google.apphosting.runtime.security.shared.intercept.java.lang.reflect.Method_$1.run(Method_.java:165) > at java.security.AccessController.doPrivileged(Native Method) > at > com.google.apphosting.runtime.security.shared.intercept.java.lang.reflect.Method_.privilegedInvoke(Method_.java:163) > at > com.google.apphosting.runtime.security.shared.intercept.java.lang.reflect.Method_.invoke_(Method_.java:124) > at > com.google.apphosting.runtime.security.shared.intercept.java.lang.reflect.Method_.invoke(Method_.java:43) > at > com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:569) > at > com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208) > at > com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248) > at > com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62) > at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) > at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) > at > com.google.inject.servlet.ServletDefinition.doService(ServletDefinition.java:216) > at > com.google.inject.servlet.ServletDefinition.service(ServletDefinition.java:141) > at > com.google.inject.servlet.ManagedServletPipeline.service(ManagedServletPipeline.java:95) > at > com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:62) > at > com.google.sitebricks.SitebricksFilter.doFilter(SitebricksFilter.java:67) > at > com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:129) > at > com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58) > at > com.google.sitebricks.HiddenMethodFilter.doFilter(HiddenMethodFilter.java:74) > at > com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:129) > at > com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58) > at > com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:134) > at > com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58) > at > com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:134) > at > com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58) > at com.evo.adm.server.EncodingFilter.doFilter(EncodingFilter.java:25) > at > com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:129) > at > com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58) > at > com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:122) > at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:110) > at > org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) > at > com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:97) > at > org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) > at > com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:35) > at > org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) > at > com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) > at > org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) > at > org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) > at > org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) > at > org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) > at > org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) > at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) > at > com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:249) > at > org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) > at org.mortbay.jetty.Server.handle(Server.java:326) > at > org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) > at > org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923) > at > com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76) > at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) > at > com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:135) > at > com.google.apphosting.runtime.JavaRuntime.handleRequest(JavaRuntime.java:260) > at > com.google.apphosting.base.RuntimePb$EvaluationRuntime$2.handleRequest(RuntimePb.java:9805) > at com.google.net.rpc.impl.RpcUtil.runRpcInApplication(RpcUtil.java:422) > at com.google.net.rpc.impl.Server$RpcTask.runInContext(Server.java:579) > at > com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:449) > at com.google.tracing.TraceContext.runInContext(TraceContext.java:689) > at > com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:327) > at > com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:319) > at > com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:447) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) > at java.lang.Thread.run(Thread.java:636) > NestedThrowablesStackTrace: > > > > com.google.appengine.api.datastore.DatastoreTimeoutException: The datastore > operation timed out, or the data was temporarily unavailable. > at > com.google.appengine.api.datastore.DatastoreApiHelper.translateError(DatastoreApiHelper.java:46) > at > com.google.appengine.api.datastore.DatastoreApiHelper$1.convertException(DatastoreApiHelper.java:98) > at > com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:69) > at > com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:67) > at > com.google.appengine.api.datastore.FutureHelper.getInternal(FutureHelper.java:71) > at > com.google.appengine.api.datastore.FutureHelper.quietGet(FutureHelper.java:32) > at > com.google.appengine.api.datastore.TransactionImpl.commit(TransactionImpl.java:76) > at > org.datanucleus.store.appengine.DatastoreTransaction.commit(DatastoreTransaction.java:61) > at > org.datanucleus.store.appengine.DatastoreXAResource.commit(DatastoreXAResource.java:88) > at org.datanucleus.transaction.Transaction.commit(Transaction.java:149) > at > org.datanucleus.transaction.TransactionManager.commit(TransactionManager.java:95) > > > > com.google.appengine.api.datastore.DatastoreTimeoutException: The datastore > operation timed out, or the data was temporarily unavailable. > at > com.google.appengine.api.datastore.DatastoreApiHelper.translateError(DatastoreApiHelper.java:46) > at > com.google.appengine.api.datastore.DatastoreApiHelper$1.convertException(DatastoreApiHelper.java:98) > at > com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:69) > at > com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:67) > at > com.google.appengine.api.datastore.FutureHelper.getInternal(FutureHelper.java:71) > at > com.google.appengine.api.datastore.FutureHelper.quietGet(FutureHelper.java:32) > at > com.google.appengine.api.datastore.TransactionImpl.commit(TransactionImpl.java:76) > at > org.datanucleus.store.appengine.DatastoreTransaction.commit(DatastoreTransaction.java:61) > at > org.datanucleus.store.appengine.DatastoreXAResource.commit(DatastoreXAResource.java:88) > at org.datanucleus.transaction.Transaction.commit(Transaction.java:149) > at > org.datanucleus.transaction.TransactionManager.commit(TransactionManager.java:95) > > > > ContractEntity: name=1478445 > *BillEntity: > name=147844510771988481584792271109360773021467817511312270193553* > > > The problem is that after the rollback, the data appears in the datastore. In > this case BillEntity with > ID=*147844510771988481584792271109360773021467817511312270193553*. Any idea > where I'm doing something wrong or there is some datastore issue? > > Please note that all Contract, Bill and Receipt are in the same entity group. > > > > btw, I'm using custom JDO support for warp-persist ( > http://code.google.com/p/warp-persist/issues/attachmentText?id=38&aid=-4857876859664333894&name=jdo_support.diff&token=9e6549dc59809146483446f786869682 > - JdoLocalTxnInterceptor) and the transactions are handled by: > > @Transactional(rollbackOn = Exception.class) > > .... > > So when any exception occurs, the transaction is rolled back immediately. > > > > -- > You received this message because you are subscribed to the Google Groups > "Google App Engine for Java" group. > To view this discussion on the web visit > https://groups.google.com/d/msg/google-appengine-java/-/Cm-m4-JtzrsJ. > To post to this group, send email to > google-appengine-java@googlegroups.com. > To unsubscribe from this group, send email to > google-appengine-java+unsubscr...@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/google-appengine-java?hl=en. > -- You received this message because you are subscribed to the Google Groups "Google App Engine for Java" group. To post to this group, send email to google-appengine-java@googlegroups.com. To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en.