java - StaleObjectStateException on high frequency updates -


we're using hibernate 3.6.3.final , mysql 5.5.8 web application. backend running on jboss 6.0.0 final server. of time things work we're getting staleobjectstateexception. after while of experimenting figured out can reproduced sending requests backend high frequency (ie. clicking button triggers request fast possible).

as far know exception means domain object got fetched database , when hibernate tried persist again noticed transaction changed in meantime.

however far understand databases conflicting transactions should isolated extent prevents behavior. explicitly changed isolation level serializable guarantees repeatable reads , disabled hibernate caching. should prevent situation 1 transaction sees different versions of same domain object.

the full stack trace is:

    2011-04-28 20:46:17,865 warn  [com.arjuna.ats.arjuna] (workerthread#2[127.0.0.1:57772]) arjuna-12125 twophasecoordinator.beforecompletion - failed synchronizationimple< 0:ffff7f000001:126a:4db9c7b0:74d, org.hibernate.transaction.synchronization.hibernatesynchronizationimpl@481efbaf >: javax.persistence.optimisticlockexception: org.hibernate.staleobjectstateexception: row updated or deleted transaction (or unsaved-value mapping incorrect): [xxx.modules.domain.entity.user#118]         @ org.hibernate.ejb.abstractentitymanagerimpl.wrapstalestateexception(abstractentitymanagerimpl.java:1243) [:3.6.0.final]         @ org.hibernate.ejb.abstractentitymanagerimpl.convert(abstractentitymanagerimpl.java:1166) [:3.6.0.final]         @ org.hibernate.ejb.abstractentitymanagerimpl.convert(abstractentitymanagerimpl.java:1147) [:3.6.0.final]         @ org.hibernate.ejb.abstractentitymanagerimpl.convert(abstractentitymanagerimpl.java:1153) [:3.6.0.final]         @ org.hibernate.ejb.abstractentitymanagerimpl$3.mapmanagedflushfailure(abstractentitymanagerimpl.java:1067) [:3.6.0.final]         @ org.hibernate.transaction.synchronization.callbackcoordinator.beforecompletion(callbackcoordinator.java:122) [:3.6.0.final]         @ org.hibernate.transaction.synchronization.hibernatesynchronizationimpl.beforecompletion(hibernatesynchronizationimpl.java:51) [:3.6.0.final]         @ com.arjuna.ats.internal.jta.resources.arjunacore.synchronizationimple.beforecompletion(synchronizationimple.java:97) [:6.0.0.final]         @ com.arjuna.ats.arjuna.coordinator.twophasecoordinator.beforecompletion(twophasecoordinator.java:274) [:6.0.0.final]         @ com.arjuna.ats.arjuna.coordinator.twophasecoordinator.end(twophasecoordinator.java:94) [:6.0.0.final]         @ com.arjuna.ats.arjuna.atomicaction.commit(atomicaction.java:159) [:6.0.0.final]         @ com.arjuna.ats.internal.jta.transaction.arjunacore.transactionimple.commitanddisassociate(transactionimple.java:1158) [:6.0.0.final]         @ com.arjuna.ats.internal.jta.transaction.arjunacore.basetransaction.commit(basetransaction.java:119) [:6.0.0.final]         @ com.arjuna.ats.jbossatx.basetransactionmanagerdelegate.commit(basetransactionmanagerdelegate.java:75) [:6.0.0.final]         @ org.jboss.ejb3.tx2.impl.cmttxinterceptor.endtransaction(cmttxinterceptor.java:82) [:0.0.1]         @ org.jboss.ejb3.tx2.impl.cmttxinterceptor.invokeinourtx(cmttxinterceptor.java:255) [:0.0.1]         @ org.jboss.ejb3.tx2.impl.cmttxinterceptor.required(cmttxinterceptor.java:349) [:0.0.1]         @ org.jboss.ejb3.tx2.impl.cmttxinterceptor.invoke(cmttxinterceptor.java:209) [:0.0.1]         @ org.jboss.ejb3.tx2.aop.cmttxinterceptorwrapper.invoke(cmttxinterceptorwrapper.java:52) [:0.0.1]         @ org.jboss.aop.joinpoint.methodinvocation.invokenext(methodinvocation.java:102) [jboss-aop.jar:2.2.1.ga]         @ org.jboss.aspects.tx.txpropagationinterceptor.invoke(txpropagationinterceptor.java:76) [:1.0.0.ga]         @ org.jboss.aop.joinpoint.methodinvocation.invokenext(methodinvocation.java:102) [jboss-aop.jar:2.2.1.ga]         @ org.jboss.ejb3.tx.nullinterceptor.invoke(nullinterceptor.java:42) [:1.0.3]         @ org.jboss.aop.joinpoint.methodinvocation.invokenext(methodinvocation.java:102) [jboss-aop.jar:2.2.1.ga]         @ org.jboss.ejb3.security.ejb3authenticationinterceptorv2.invoke(ejb3authenticationinterceptorv2.java:182) [:1.7.17]         @ org.jboss.aop.joinpoint.methodinvocation.invokenext(methodinvocation.java:102) [jboss-aop.jar:2.2.1.ga]         @ org.jboss.ejb3.encpropagationinterceptor.invoke(encpropagationinterceptor.java:41) [:1.7.17]         @ org.jboss.aop.joinpoint.methodinvocation.invokenext(methodinvocation.java:102) [jboss-aop.jar:2.2.1.ga]         @ org.jboss.ejb3.blockcontainershutdowninterceptor.invoke(blockcontainershutdowninterceptor.java:67) [:1.7.17]         @ org.jboss.aop.joinpoint.methodinvocation.invokenext(methodinvocation.java:102) [jboss-aop.jar:2.2.1.ga]         @ org.jboss.ejb3.core.context.currentinvocationcontextinterceptor.invoke(currentinvocationcontextinterceptor.java:47) [:1.7.17]         @ org.jboss.aop.joinpoint.methodinvocation.invokenext(methodinvocation.java:102) [jboss-aop.jar:2.2.1.ga]         @ org.jboss.aspects.currentinvocation.currentinvocationinterceptor.invoke(currentinvocationinterceptor.java:67) [:1.0.1]         @ org.jboss.aop.joinpoint.methodinvocation.invokenext(methodinvocation.java:102) [jboss-aop.jar:2.2.1.ga]         @ org.jboss.ejb3.interceptor.ejb3tcclinterceptor.invoke(ejb3tcclinterceptor.java:86) [:1.7.17]         @ org.jboss.aop.joinpoint.methodinvocation.invokenext(methodinvocation.java:102) [jboss-aop.jar:2.2.1.ga]         @ org.jboss.ejb3.stateless.statelesscontainer.dynamicinvoke(statelesscontainer.java:392) [:1.7.17]         @ org.jboss.ejb3.session.invokablecontextclassproxyhack._dynamicinvoke(invokablecontextclassproxyhack.java:53) [:1.7.17]         @ org.jboss.aop.dispatcher.invoke(dispatcher.java:91) [jboss-aop.jar:2.2.1.ga]         @ org.jboss.aspects.remoting.aopremotinginvocationhandler.invoke(aopremotinginvocationhandler.java:82) [:1.0.1.ga]         @ org.jboss.remoting.serverinvoker.invoke(serverinvoker.java:898) [:6.0.0.final]         @ org.jboss.remoting.transport.socket.serverthread.completeinvocation(serverthread.java:791) [:6.0.0.final]         @ org.jboss.remoting.transport.socket.serverthread.processinvocation(serverthread.java:744) [:6.0.0.final]         @ org.jboss.remoting.transport.socket.serverthread.dorun(serverthread.java:586) [:6.0.0.final]         @ org.jboss.remoting.transport.socket.serverthread.run(serverthread.java:234) [:6.0.0.final] caused by: org.hibernate.staleobjectstateexception: row updated or deleted transaction (or unsaved-value mapping incorrect): [xxx.modules.domain.entity.user#118]         @ org.hibernate.persister.entity.abstractentitypersister.check(abstractentitypersister.java:1932) [:3.6.0.final]         @ org.hibernate.persister.entity.abstractentitypersister.update(abstractentitypersister.java:2576) [:3.6.0.final]         @ org.hibernate.persister.entity.abstractentitypersister.updateorinsert(abstractentitypersister.java:2476) [:3.6.0.final]         @ org.hibernate.persister.entity.abstractentitypersister.update(abstractentitypersister.java:2803) [:3.6.0.final]         @ org.hibernate.action.entityupdateaction.execute(entityupdateaction.java:113) [:3.6.0.final]         @ org.hibernate.engine.actionqueue.execute(actionqueue.java:273) [:3.6.0.final]         @ org.hibernate.engine.actionqueue.executeactions(actionqueue.java:265) [:3.6.0.final]         @ org.hibernate.engine.actionqueue.executeactions(actionqueue.java:185) [:3.6.0.final]         @ org.hibernate.event.def.abstractflushingeventlistener.performexecutions(abstractflushingeventlistener.java:321) [:3.6.0.final]         @ org.hibernate.event.def.defaultflusheventlistener.onflush(defaultflusheventlistener.java:51) [:3.6.0.final]         @ org.hibernate.impl.sessionimpl.flush(sessionimpl.java:1216) [:3.6.0.final]         @ org.hibernate.impl.sessionimpl.managedflush(sessionimpl.java:383) [:3.6.0.final]         @ org.hibernate.transaction.synchronization.callbackcoordinator.beforecompletion(callbackcoordinator.java:117) [:3.6.0.final]         ... 39 more 

any appreciated!

thanks in advance michael

are very, very sure you've set tx serializable? because should never happen on serializable transaction.

if 2 tx read , modify same row in serializable transaction, oracle throws ora-08177.

please check hibernate setting tx serializable.

edit

you can jonas suggested or can check application getting underlying connection , invoking connection.getisolationlevel(). example

connection c = session.connection() int level = c.getisolationlevel() 

edit 2

ok, since confirmed isolation level on connection serialilizable, check:

  • that tables using innodb engine.
  • as jonas suggested, run select @@tx_isolation; code while in transaction. should return serializable. check connection propagating isolation level. it's bit paranoid, do...
  • check code opens 1 transaction, , runs in tx. tested serializable isolation level manually , works expected (it blocks tx trying read same row).
  • last resort: check isolation level serializable works on mysql installation.

note: mentioned before, mysql block queries trying read same row. means if have "common tables" such country, company, user, etc. many txs read concurrently, might make app run sequencially rather parallelly.


Comments

Popular posts from this blog

objective c - Change font of selected text in UITextView -

php - Accessing POST data in Facebook cavas app -

c# - Getting control value when switching a view as part of a multiview -