diff options
Diffstat (limited to 'plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/DBSchemaTransaction.java')
-rw-r--r-- | plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/DBSchemaTransaction.java | 37 |
1 files changed, 24 insertions, 13 deletions
diff --git a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/DBSchemaTransaction.java b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/DBSchemaTransaction.java index 970a166624..525766124e 100644 --- a/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/DBSchemaTransaction.java +++ b/plugins/org.eclipse.net4j.db/src/org/eclipse/net4j/internal/db/DBSchemaTransaction.java @@ -37,6 +37,8 @@ public final class DBSchemaTransaction implements IDBSchemaTransaction, Runnable private IDBSchema oldSchema; + private IDBSchema oldSchemaCopy; + private IDBSchema workingCopy; public DBSchemaTransaction(DBDatabase database) @@ -44,6 +46,8 @@ public final class DBSchemaTransaction implements IDBSchemaTransaction, Runnable this.database = database; oldSchema = database.getSchema(); + oldSchemaCopy = DBUtil.copySchema(oldSchema); + IDBSchema copy = DBUtil.copySchema(oldSchema); workingCopy = DelegatingDBSchemaElement.wrap(copy); } @@ -89,7 +93,7 @@ public final class DBSchemaTransaction implements IDBSchemaTransaction, Runnable public DBSchemaDelta getSchemaDelta() { - return (DBSchemaDelta)workingCopy.compare(oldSchema); + return (DBSchemaDelta)workingCopy.compare(oldSchemaCopy); } public DBSchemaDelta commit() @@ -99,6 +103,9 @@ public final class DBSchemaTransaction implements IDBSchemaTransaction, Runnable return DBUtil.execute(database, this); } + // Remember connection locally because the instance field will be reset in run/doClose. + DBConnection connection = this.connection; + try { DBSchemaDelta result = run(connection); @@ -116,19 +123,22 @@ public final class DBSchemaTransaction implements IDBSchemaTransaction, Runnable { DBSchemaDelta delta = getSchemaDelta(); - try - { - ((InternalDBSchema)oldSchema).unlock(); - - DBAdapter adapter = database.getAdapter(); - adapter.updateSchema(connection, oldSchema, delta); - - ((DelegatingDBSchema)workingCopy).setDelegate(oldSchema); - } - finally + synchronized (oldSchema) { - ((InternalDBSchema)oldSchema).lock(); - doClose(delta); + try + { + ((InternalDBSchema)oldSchema).unlock(); + + DBAdapter adapter = database.getAdapter(); + adapter.updateSchema(connection, oldSchema, delta); + + ((DelegatingDBSchema)workingCopy).setDelegate(oldSchema); + } + finally + { + ((InternalDBSchema)oldSchema).lock(); + doClose(delta); + } } return delta; @@ -146,6 +156,7 @@ public final class DBSchemaTransaction implements IDBSchemaTransaction, Runnable database.closeSchemaTransaction(delta); connection = null; oldSchema = null; + oldSchemaCopy = null; workingCopy = null; } } |