ee);
}
return false;
+ } catch (OptimisticLockException e) {
+ logger.log(Level.WARNING, "Failed to remove row, rolling back",
+ e);
+ try {
+ delegate.rollback();
+ } catch (SQLException ee) {
+ /* Nothing can be done here */
+ logger.log(Level.SEVERE, "Failed to rollback row removal",
+ ee);
+ }
+ throw e;
}
} else {
removedItems.put((RowId) itemId, (RowItem) getItem(itemId));
logger.log(Level.SEVERE, "Failed to roll back", ee);
}
return false;
+ } catch (OptimisticLockException e) {
+ logger.log(Level.WARNING,
+ "removeAllItems() failed, rolling back", e);
+ try {
+ delegate.rollback();
+ } catch (SQLException ee) {
+ /* Nothing can be done here */
+ logger.log(Level.SEVERE, "Failed to roll back", ee);
+ }
+ throw e;
}
} else {
for (Object id : getItemIds()) {
} catch (SQLException e) {
delegate.rollback();
throw e;
+ } catch (OptimisticLockException e) {
+ delegate.rollback();
+ throw e;
}
}
@RunWith(Suite.class)
@SuiteClasses({ SimpleJDBCConnectionPoolTest.class,
- J2EEConnectionPoolTest.class, LikeTest.class,
- QueryBuilderTest.class, FreeformQueryTest.class,
- RowIdTest.class, SQLContainerTest.class,
+ J2EEConnectionPoolTest.class, LikeTest.class, QueryBuilderTest.class,
+ FreeformQueryTest.class, RowIdTest.class, SQLContainerTest.class,
SQLContainerTableQueryTest.class, ColumnPropertyTest.class,
TableQueryTest.class, SQLGeneratorsTest.class, UtilTest.class,
- TicketTests.class, BetweenTest.class, ReadOnlyRowIdTest.class})
+ TicketTests.class, BetweenTest.class, ReadOnlyRowIdTest.class })
public class AllTests {
/* Set the DB used for testing here! */
public enum DB {
versionStatements = new String[] {
"create table VERSIONED (ID integer auto_increment not null, TEXT varchar(255), VERSION tinyint default 0, primary key(ID))",
"CREATE TRIGGER upd_version BEFORE UPDATE ON VERSIONED"
- + " FOR EACH ROW SET NEW.VERSION = @VERSION+1" };
+ + " FOR EACH ROW SET NEW.VERSION = OLD.VERSION+1" };
break;
case POSTGRESQL:
offset = 1;
container.commit();\r
}\r
\r
+ @Test\r
+ public void removeRow_throwsOptimisticLockException_shouldStillWork()\r
+ throws SQLException {\r
+ if (AllTests.db == AllTests.DB.HSQLDB) {\r
+ // HSQLDB doesn't support versioning, so this is to make the test\r
+ // green.\r
+ return;\r
+ }\r
+ DataGenerator.addVersionedData(connectionPool);\r
+\r
+ TableQuery tQuery = new TableQuery("versioned", connectionPool,\r
+ AllTests.sqlGen);\r
+ tQuery.setVersionColumn("VERSION");\r
+ SQLContainer container = new SQLContainer(tQuery);\r
+ RowItem row = (RowItem) container.getItem(container.firstItemId());\r
+ Assert.assertEquals("Junk", row.getItemProperty("TEXT").getValue());\r
+\r
+ // Update the version using another connection.\r
+ Connection conn = connectionPool.reserveConnection();\r
+ PreparedStatement stmt = conn\r
+ .prepareStatement("UPDATE VERSIONED SET \"TEXT\" = ? WHERE \"ID\" = ?");\r
+ stmt.setString(1, "asdf");\r
+ stmt.setObject(2, row.getItemProperty("ID").getValue());\r
+ stmt.executeUpdate();\r
+ stmt.close();\r
+ conn.commit();\r
+ connectionPool.releaseConnection(conn);\r
+\r
+ Object itemToRemove = container.firstItemId();\r
+ try {\r
+ container.removeItem(itemToRemove);\r
+ container.commit();\r
+ } catch (OptimisticLockException e) {\r
+ // This is expected, refresh and try again.\r
+ container.rollback();\r
+ container.removeItem(itemToRemove);\r
+ container.commit();\r
+ }\r
+ Object id = container.addItem();\r
+ RowItem item = (RowItem) container.getItem(id);\r
+ item.getItemProperty("TEXT").setValue("foo");\r
+ container.commit();\r
+ }\r
+\r
}
\ No newline at end of file