A more helpful reply.

The exception given seems to give a clue.

Caused by: org.h2.jdbc.JdbcSQLException: Concurrent update in table
"UNIQUE_a_INDEX_A": another transaction has updated or deleted the same row

It would seem you are updating the row simultaneously in 2 transactions?, Therefore giving the exception. I'm not sure why it references the index as the table name? That would appear to be a bug?. Maybe you have 2 simultaneous inserts in the table? I'm not sure how MVCC handles that.

Also note that MVCC is "experimental".

Thanks, Ryan




On 26/02/2013 9:34 PM, srinivas wrote:
Hi,

We are getting this exception on trying to insert to a table:

insert into materials (id, a, b, c, d, e, f) values (null, ?, ?, ?, ?, ?,
'a') [50200-168]; nested exception is org.h2.jdbc.JdbcSQLException: Timeout
trying to lock table ; SQL statement:
insert into materials (id, a, b, c, d, e, f) values (null, ?, ?, ?, ?, ?,
'a') [50200-168]
        at
org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.translate(SQLStateSQLExceptionTranslator.java:124)
        at
org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.translate(SQLErrorCodeSQLExceptionTranslator.java:322)
        at
org.springframework.orm.hibernate3.HibernateAccessor.convertJdbcAccessException(HibernateAccessor.java:424)
        at
org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:410)
        at
org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:379)
        at
org.springframework.orm.hibernate3.HibernateTemplate.save(HibernateTemplate.java:645)
        at com.x.MaterialRepository.save(MaterialRepository.java:281)
        at 
com.x.MaterialRepository.findOrCreateFrom(MaterialRepository.java:317)
        at
com.x.MaterialDatabaseUpdater.folderFor(MaterialDatabaseUpdater.java:140)
        at
com.x.MaterialDatabaseUpdater.initializeMaterialWithLatestRevision(MaterialDatabaseUpdater.java:102)
        at
com.x.MaterialDatabaseUpdater.access$000(MaterialDatabaseUpdater.java:30)
        at
com.x.MaterialDatabaseUpdater$1.doInTransaction(MaterialDatabaseUpdater.java:73)
        at
com.x.transaction.TransactionCallback.doWithExceptionHandling(TransactionCallback.java:8)
        at
com.x.transaction.TransactionTemplate$3.doInTransaction(TransactionTemplate.java:37)
        at
org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:128)
        at
com.x.transaction.TransactionTemplate.executeWithExceptionHandling(TransactionTemplate.java:33)
        at
com.x.MaterialDatabaseUpdater.updateMaterial(MaterialDatabaseUpdater.java:71)
        at 
com.x.MaterialUpdateListener.onMessage(MaterialUpdateListener.java:27)
        at 
com.x.MaterialUpdateListener.onMessage(MaterialUpdateListener.java:12)
        at
com.x.messaging.activemq.JMSMessageListenerAdapter.runImpl(JMSMessageListenerAdapter.java:49)
        at
com.x.activemq.JMSMessageListenerAdapter.run(JMSMessageListenerAdapter.java:34)
        at java.lang.Thread.run(Thread.java:662)
Caused by: org.h2.jdbc.JdbcSQLException: Timeout trying to lock table ; SQL
statement:
insert into materials (id, a, b, c, d, e, f) values (null, ?, ?, ?, ?, ?,
'a') [50200-168]
        at org.h2.message.DbException.getJdbcSQLException(DbException.java:329)
        at org.h2.message.DbException.get(DbException.java:158)
        at org.h2.command.Command.filterConcurrentUpdate(Command.java:276)
        at org.h2.command.Command.executeUpdate(Command.java:232)
        at
org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:156)
        at
org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:142)
        at
org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
        at
org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
        at
org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:94)
        at
org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:57)
        at
org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2176)
        at
org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2656)
        at
org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:71)
        at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:279)
        at
org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:321)
        at
org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:204)
        at
org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:130)
        at
org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:210)
        at
org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:56)
        at
org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:195)
        at
org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:50)
        at
org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93)
        at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:563)
        at org.hibernate.impl.SessionImpl.save(SessionImpl.java:551)
        at org.hibernate.impl.SessionImpl.save(SessionImpl.java:547)
        at
org.springframework.orm.hibernate3.HibernateTemplate$12.doInHibernate(HibernateTemplate.java:648)
        at
org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:374)
        ... 17 more
Caused by: org.h2.jdbc.JdbcSQLException: Concurrent update in table
"UNIQUE_a_INDEX_A": another transaction has updated or deleted the same row
[90131-168]
        at org.h2.message.DbException.getJdbcSQLException(DbException.java:329)
        at org.h2.message.DbException.get(DbException.java:169)
        at org.h2.message.DbException.get(DbException.java:146)
        at org.h2.table.RegularTable.addRow(RegularTable.java:146)
        at org.h2.command.dml.Insert.insertRows(Insert.java:124)
        at org.h2.command.dml.Insert.update(Insert.java:84)
        at org.h2.command.CommandContainer.update(CommandContainer.java:75)
        at org.h2.command.Command.executeUpdate(Command.java:230)
        ... 40 more

We are using: h2-1.3.168.jar with Hibernate (3.3.2.GA) & IBatis (2.3.4.726).
With following settings: jdbc:h2:" + path +
"/cruise;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MVCC=TRUE;CACHE_SIZE=131072;DATABASE_EVENT_LISTENER='"
+ ClassName + "'";

We found this post related to the error:
http://stackoverflow.com/questions/14060632/how-to-do-testing-with-hibernate-h2-using-testng

Do you have an idea when this can occur?

Regards,
Srinivas




--
View this message in context: 
http://h2-database.66688.n3.nabble.com/MVCC-and-SELECT-FOR-UPDATE-tp2140527p4025850.html
Sent from the H2 Database mailing list archive at Nabble.com.



--
You received this message because you are subscribed to the Google Groups "H2 
Database" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to h2-database+unsubscr...@googlegroups.com.
To post to this group, send email to h2-database@googlegroups.com.
Visit this group at http://groups.google.com/group/h2-database?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to