Frage

Während ADO.NET mit (vielleicht ich falsch bin, ich weiß nicht, was sein genannt) merke ich, dass ich nur eine Transaktion mit einem Anschluss beginnen kann und ein Befehl scheint command.Transaction zu haben, die mir die Transaktionsdaten aber tun bekommt starten Sie eine Transaktion selbst? Eigentlich beim Schauen ich sehe dies in System.Data.SQLite

// Summary:
    //     The transaction associated with this command. SQLite only supports one transaction
    //     per connection, so this property forwards to the command's underlying connection.
    [Browsable(false)]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    public SQLiteTransaction Transaction { get; set; }

So nur SQLite eine Transaktionsperiode unterstützt? Ich habe versucht zu öffnen eine andere Verbindung, aber dann meine Transaktion warf eine Ausnahme über die DB erfaßt werden kann. So kann ich nicht mehr als eine Verbindung gleichzeitig habe auch?

War es hilfreich?

Lösung

Eine Transaktion pro Verbindung, ja, aber es kann mehr als eine Verbindung hat (jeweils mit einer eigenen aktiven Transaktion).

Update: interessant. Ich wusste nicht, über Shared-Cache-Modus. Wenn die Verbindung dieses Modus verwendet, nur eine Transaktion ist für alle Verbindungen zur Verfügung, den gleichen Shared-Cache verwenden. Siehe SQLite Shared-Cache-Modus .

Andere Tipps

ich über mehrere Verbindungen nicht sicher bin, hat es wohl mit der Tatsache zu tun, dass eine Verbindung, die Datei seit SQLite verriegelt ist ein dateibasierte DB und nicht eine serverbasierte DB (auf einem serverbasierten DB des Server hält alle Dateien gesperrt und befasst sich mit gleichzeitiger Verbindungen).

Sie können nur eine Transaktion offen zu einem Zeitpunkt. Dies sollte intuitiv Sinn, da alles, was nach dem Fall eine Transaktion in dieser Transaktion beginnen, bis entweder einem rollback oder commit. Dann können Sie einen neuen starten. SQLite verlangt, dass alle Befehl in einer Transaktion sein, wenn Sie also nicht manuell ein neues öffnen Sie, wird es tun für Sie.

Wenn Sie verschachtelte Transaktionen besorgt sind, können Sie fälschen sie mit savepoint. Dokumentation

Im Umkreis von 1 Transaktion können Sie nur 1 Anschluss Lesen / Schreiben, bis die Transaktion durchgeführt wird. Deshalb müssen Sie das Verbindungsobjekt übergeben, wenn Sie ein Unternehmen Transaktion zu tun, die mehrere SQL-Anweisungen wie folgt umfasst:

public class TimeTableService
    {
        ITimeTableDataProvider _provider = new TimeTableDataProvider();

        public void CreateLessonPlanner(WizardData wizardData)
        {
            using (var con = _provider.GetConnection())
            using (var trans = new TransactionScope())
            {
                con.Open();

                var weekListA = new List<Week>();
                var weekListB = new List<Week>();

                LessonPlannerCreator.CreateLessonPlanner(weekListA, weekListB, wizardData);

                _provider.DeleteLessonPlanner(wizardData.StartDate, con);

                _provider.CreateLessonPlanner(weekListA, con);
                _provider.CreateLessonPlanner(weekListB, con);

                _provider.DeleteTimeTable(TimeTable.WeekType.A, con);
                _provider.StoreTimeTable(wizardData.LessonsWeekA.ToList<TimeTable>(), TimeTable.WeekType.A, con);

                _provider.DeleteTimeTable(TimeTable.WeekType.B, con);
                _provider.StoreTimeTable(wizardData.LessonsWeekB.ToList<TimeTable>(), TimeTable.WeekType.B, con);

                trans.Complete();
            }
        }
    }

Die Verbindung und transactoin Ressourcen werden automatisch durch die Verwendung-Anweisung freigegeben / geschlossen.

In jeder Dataprovider Methode, die Sie dann tun

using(var cmd = new SQLiteCommand("MyStatement",con)
{
   // Create params + ExecuteNonQuery
}

Die Transaction Klasse ist neu in .NET 3.5 und macht automatisch einen Rollback, wenn eine Ausnahme auftritt. Einfache Handhabung ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top