diff --git a/osu.Game/Database/DatabaseContextFactory.cs b/osu.Game/Database/DatabaseContextFactory.cs
index 65a19e23c0..ec408456e3 100644
--- a/osu.Game/Database/DatabaseContextFactory.cs
+++ b/osu.Game/Database/DatabaseContextFactory.cs
@@ -41,17 +41,18 @@ namespace osu.Game.Database
/// Request a context for write usage. Can be consumed in a nested fashion (and will return the same underlying context).
/// This method may block if a write is already active on a different thread.
///
+ /// Whether to start a transaction for this write.
/// A usage containing a usable context.
- public DatabaseWriteUsage GetForWrite()
+ public DatabaseWriteUsage GetForWrite(bool withTransaction = true)
{
Monitor.Enter(writeLock);
- if (currentWriteTransaction == null)
+ if (currentWriteTransaction == null && withTransaction)
currentWriteTransaction = threadContexts.Value.Database.BeginTransaction();
Interlocked.Increment(ref currentWriteUsages);
- return new DatabaseWriteUsage(threadContexts.Value, usageCompleted) { IsTransactionLeader = currentWriteUsages == 1 };
+ return new DatabaseWriteUsage(threadContexts.Value, usageCompleted) { IsTransactionLeader = currentWriteTransaction != null && currentWriteUsages == 1 };
}
private void usageCompleted(DatabaseWriteUsage usage)
@@ -66,9 +67,9 @@ namespace osu.Game.Database
if (usages > 0) return;
if (currentWriteDidError)
- currentWriteTransaction.Rollback();
+ currentWriteTransaction?.Rollback();
else
- currentWriteTransaction.Commit();
+ currentWriteTransaction?.Commit();
currentWriteTransaction = null;
currentWriteDidWrite = false;
diff --git a/osu.Game/Database/IDatabaseContextFactory.cs b/osu.Game/Database/IDatabaseContextFactory.cs
index 372e1770e4..d38d15b252 100644
--- a/osu.Game/Database/IDatabaseContextFactory.cs
+++ b/osu.Game/Database/IDatabaseContextFactory.cs
@@ -14,7 +14,8 @@ namespace osu.Game.Database
/// Request a context for write usage. Can be consumed in a nested fashion (and will return the same underlying context).
/// This method may block if a write is already active on a different thread.
///
+ /// Whether to start a transaction for this write.
/// A usage containing a usable context.
- DatabaseWriteUsage GetForWrite();
+ DatabaseWriteUsage GetForWrite(bool withTransaction = true);
}
}
diff --git a/osu.Game/Database/SingletonContextFactory.cs b/osu.Game/Database/SingletonContextFactory.cs
index 74951e8433..ce3fbf6881 100644
--- a/osu.Game/Database/SingletonContextFactory.cs
+++ b/osu.Game/Database/SingletonContextFactory.cs
@@ -14,6 +14,6 @@ namespace osu.Game.Database
public OsuDbContext Get() => context;
- public DatabaseWriteUsage GetForWrite() => new DatabaseWriteUsage(context, null);
+ public DatabaseWriteUsage GetForWrite(bool withTransaction = true) => new DatabaseWriteUsage(context, null);
}
}
diff --git a/osu.Game/OsuGameBase.cs b/osu.Game/OsuGameBase.cs
index a3a081d6d1..b9d32a6322 100644
--- a/osu.Game/OsuGameBase.cs
+++ b/osu.Game/OsuGameBase.cs
@@ -208,7 +208,7 @@ namespace osu.Game
{
try
{
- using (var db = contextFactory.GetForWrite())
+ using (var db = contextFactory.GetForWrite(false))
db.Context.Migrate();
}
catch (MigrationFailedException e)
@@ -220,7 +220,7 @@ namespace osu.Game
contextFactory.ResetDatabase();
Logger.Log("Database purged successfully.", LoggingTarget.Database, LogLevel.Important);
- using (var db = contextFactory.GetForWrite())
+ using (var db = contextFactory.GetForWrite(false))
db.Context.Migrate();
}
}