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.

Reply via email to