Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
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.java37
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;
}
}

Back to the top