15 Stimmen

System.Data.SQLite unterstützt keine Mehrfachtransaktionen

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!

16voto

OP initiiert Transaktionen auf 2 Verbindungen, das ist der Grund für die Probleme, nicht mehrere Transaktionen an sich.

SQLiteConnection conn = new SQLiteConnection("data source=:memory:");
conn.Open();

var command = conn.CreateCommand();
command.CommandText = "create table a (b integer primary key autoincrement, c text)";
command.ExecuteNonQuery();

var tran1 = conn.BeginTransaction();
var tran2 = conn.BeginTransaction();

var command1 = conn.CreateCommand();
var command2 = conn.CreateCommand();

command1.Transaction = tran1;
command2.Transaction = tran2;

command1.CommandText = "insert into a VALUES (NULL, 'bla1')";
command2.CommandText = "insert into a VALUES (NULL, 'bla2')";

command1.ExecuteNonQuery();
command2.ExecuteNonQuery();

tran1.Commit();
tran2.Commit();

command.CommandText = "select count(*) from a";
Console.WriteLine(command.ExecuteScalar());

-1voto

Branko Dimitrijevic Punkte 48944

Es scheint bei Datenanbietern üblich zu sein, nicht mehrere Transaktionen pro Verbindung zu unterstützen (ich weiß, dass es ODP.NET ist, wahrscheinlich auch andere).

Eine Möglichkeit, dieses Problem zu umgehen, ist eine separate IDbConnection für jede einzelne IDbTransaction .

-- EDIT ---

Oje! Ich habe gerade gemerkt, dass du tun mehrere Verbindungen haben. Entschuldigung.

-1voto

Yahia Punkte 68137

SQLite unterstützt keine Mehrfachtransaktionen - es sperrt die gesamte Datenbank, wenn sie sich in einer Transaktion befindet (siehe www.sqlite.org).

EDIT: Mehrere Transaktionen werden unterstützt, jedoch nicht bei Verwendung von DDL in mehr als einer Transaktion.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X