Ich habe also ein interessantes Problem mit System.Data.SQLite und die Verwendung mehrerer Transaktionen. Im Grunde habe ich den folgenden Code, der fehlschlägt:
using (IDbConnection connection1 = new SQLiteConnection("connectionstring"), connection2 = new SQLiteConnection("connectionstring"))
{
connection1.Open();
connection2.Open();
IDbTransaction transaction1 = connection1.BeginTransaction();
IDbTransaction transaction2 = connection2.BeginTransaction(); // Fails!
using(IDbCommand command = new SQLiteCommand())
{
command.Text = "CREATE TABLE artist(artistid int, artistname text);";
command.CommandType = CommandType.Text;
command.Connection = connection1;
command.ExecuteNonQuery();
}
using (IDbCommand command = new SQLiteCommand())
{
command.Text = "CREATE TABLE track(trackid int, trackname text);";
command.CommandType = CommandType.Text;
command.Connection = connection2;
command.ExecuteNonQuery();
}
transaction1.Commit();
transaction2.Commit();
}
Von dem, was ich gelesen habe, scheint es, dass System.Data.SQLite verschachtelte und durch Erweiterung sequentielle Transaktionen unterstützen sollte. Der Code schlägt in Zeile 7 (wo die zweite Transaktion deklariert wird) mit der folgenden Ausnahme fehl:
System.Data.SQLite.SQLiteException: The database file is locked
System.Data.SQLite.SQLite3.Step(SQLiteStatement stmt)
System.Data.SQLite.SQLiteDataReader.NextResult()
System.Data.SQLite.SQLiteDataReader..ctor(SQLiteCommand cmd, CommandBehavior behave)
System.Data.SQLite.SQLiteCommand.ExecuteReader(CommandBehavior behavior)
System.Data.SQLite.SQLiteCommand.ExecuteNonQuery()
System.Data.SQLite.SQLiteTransaction..ctor(SQLiteConnection connection, Boolean deferredLock)
System.Data.SQLite.SQLiteConnection.BeginDbTransaction(IsolationLevel isolationLevel)
System.Data.Common.DbConnection.System.Data.IDbConnection.BeginTransaction()
Weiß jemand, was das Problem ist oder wie man es umgehen kann? Ich denke, dass gleichzeitige Transaktionen für jedes Datenbanksystem unerlässlich sind, also muss es eine Möglichkeit geben, dies zu tun.
Danke!