diff options
Diffstat (limited to 'src/main/java')
-rw-r--r-- | src/main/java/com/amazon/carbonado/layout/LayoutFactory.java | 3 | ||||
-rw-r--r-- | src/main/java/com/amazon/carbonado/repo/sleepycat/BDBStorage.java | 65 |
2 files changed, 46 insertions, 22 deletions
diff --git a/src/main/java/com/amazon/carbonado/layout/LayoutFactory.java b/src/main/java/com/amazon/carbonado/layout/LayoutFactory.java index 8a0ede8..691d9d4 100644 --- a/src/main/java/com/amazon/carbonado/layout/LayoutFactory.java +++ b/src/main/java/com/amazon/carbonado/layout/LayoutFactory.java @@ -26,6 +26,7 @@ import org.cojen.util.SoftValuedHashMap; import com.amazon.carbonado.Cursor;
import com.amazon.carbonado.FetchException;
import com.amazon.carbonado.FetchNoneException;
+import com.amazon.carbonado.IsolationLevel;
import com.amazon.carbonado.PersistException;
import com.amazon.carbonado.Repository;
import com.amazon.carbonado.RepositoryException;
@@ -85,7 +86,7 @@ public class LayoutFactory implements LayoutCapability { StorableInfo<?> info = StorableIntrospector.examine(type);
- Transaction txn = mRepository.enterTransaction();
+ Transaction txn = mRepository.enterTopTransaction(IsolationLevel.READ_COMMITTED);
try {
// If type represents a new generation, then a new layout needs to
// be inserted.
diff --git a/src/main/java/com/amazon/carbonado/repo/sleepycat/BDBStorage.java b/src/main/java/com/amazon/carbonado/repo/sleepycat/BDBStorage.java index 6eba33a..b885399 100644 --- a/src/main/java/com/amazon/carbonado/repo/sleepycat/BDBStorage.java +++ b/src/main/java/com/amazon/carbonado/repo/sleepycat/BDBStorage.java @@ -26,6 +26,7 @@ import org.apache.commons.logging.LogFactory; import com.amazon.carbonado.Cursor;
import com.amazon.carbonado.FetchException;
+import com.amazon.carbonado.IsolationLevel;
import com.amazon.carbonado.PersistException;
import com.amazon.carbonado.Query;
import com.amazon.carbonado.Repository;
@@ -33,6 +34,7 @@ import com.amazon.carbonado.RepositoryException; import com.amazon.carbonado.Storable;
import com.amazon.carbonado.Storage;
import com.amazon.carbonado.SupportException;
+import com.amazon.carbonado.Transaction;
import com.amazon.carbonado.Trigger;
import com.amazon.carbonado.capability.IndexInfo;
@@ -425,7 +427,14 @@ abstract class BDBStorage<Txn, S extends Storable> implements Storage<S>, Storag primaryInfo.setIndexTypeDescriptor(pkIndex.getTypeDescriptor());
if (!readOnly) {
- primaryInfo.update();
+ Repository repo = mRepository.getRootRepository();
+ Transaction txn = repo.enterTopTransaction(IsolationLevel.READ_COMMITTED);
+ try {
+ primaryInfo.update();
+ txn.commit();
+ } finally {
+ txn.exit();
+ }
}
}
}
@@ -698,25 +707,37 @@ abstract class BDBStorage<Txn, S extends Storable> implements Storage<S>, Storag // Can't register itself in itself.
return null;
}
+
+ Repository repo = mRepository.getRootRepository();
+
StoredDatabaseInfo info;
try {
- info = prepareStoredDatabaseInfo();
+ info = repo.storageFor(StoredDatabaseInfo.class).prepare();
} catch (SupportException e) {
return null;
}
info.setDatabaseName(getStorableType().getName());
- if (!info.tryLoad()) {
- if (layout == null) {
- info.setEvolutionStrategy(StoredDatabaseInfo.EVOLUTION_NONE);
- } else {
- info.setEvolutionStrategy(StoredDatabaseInfo.EVOLUTION_STANDARD);
- }
- info.setCreationTimestamp(System.currentTimeMillis());
- info.setVersionNumber(0);
- if (!readOnly) {
- info.insert();
+
+
+ Transaction txn = repo.enterTopTransaction(IsolationLevel.READ_COMMITTED);
+ try {
+ if (!info.tryLoad()) {
+ if (layout == null) {
+ info.setEvolutionStrategy(StoredDatabaseInfo.EVOLUTION_NONE);
+ } else {
+ info.setEvolutionStrategy(StoredDatabaseInfo.EVOLUTION_STANDARD);
+ }
+ info.setCreationTimestamp(System.currentTimeMillis());
+ info.setVersionNumber(0);
+ if (!readOnly) {
+ info.insert();
+ }
}
+ txn.commit();
+ } finally {
+ txn.exit();
}
+
return info;
}
@@ -726,22 +747,24 @@ abstract class BDBStorage<Txn, S extends Storable> implements Storage<S>, Storag return;
}
if (!readOnly) {
+ Repository repo = mRepository.getRootRepository();
+
StoredDatabaseInfo info;
try {
- info = prepareStoredDatabaseInfo();
+ info = repo.storageFor(StoredDatabaseInfo.class).prepare();
} catch (SupportException e) {
return;
}
info.setDatabaseName(name);
- info.delete();
- }
- }
- /**
- * @throws SupportException if StoredDatabaseInfo is not supported by codec factory
- */
- private StoredDatabaseInfo prepareStoredDatabaseInfo() throws RepositoryException {
- return mRepository.getRootRepository().storageFor(StoredDatabaseInfo.class).prepare();
+ Transaction txn = repo.enterTopTransaction(IsolationLevel.READ_COMMITTED);
+ try {
+ info.delete();
+ txn.commit();
+ } finally {
+ txn.exit();
+ }
+ }
}
// Note: BDBStorage could just implement the RawSupport interface, but
|