2016-07-15 8 views
2

Ich bin neu in Realm (mit der Xamarin-Version für Android-Entwicklung in Visual Studio 2015) und möchte die Best Practices für die Abwicklung von Transaktionen kennen.Realm: MVCC und lang laufende Transaktionen

Da Realm alle Schreibvorgänge in Feldern eines RealmObject in einer Transaktion erfordert, müssen Sie, wenn Sie sich für eine Datenbindung an ein solches Objekt entscheiden, die Endbenutzer über Ihre Benutzerschnittstelle bearbeiten können, eine offene Transaktion bis zum nächsten ausführen Benutzer trifft auf Speichern ..., was in einigen Sekunden oder später passieren kann.

Realm verwendet MVCC, um Nebenläufigkeit zu verwalten, liest also nie blockieren und schreibt nur andere Schreibvorgänge blockieren (das ist mein Verständnis) so eine lang andauernde Transaktion zu halten, obwohl eine schlechte Idee (zumindest für diejenigen von uns mit SQL arbeiten) Server), scheint in Realm nicht so schlecht zu sein, wenn die Lesevorgänge nicht blockiert werden. Aber es fühlt sich immer noch falsch an.

Die damit verbundenen Fragen:

1) Was ist die empfohlene Methode, Daten-Bindung an RealmObjects zu tun?

2) hält eine Transaktion offen in jedem UI Kontext, in dem es für unvorhersehbare Mengen an Zeit eine potentielle Quelle für Fehler oder schlechter Leistung offen bleiben?

Vielen Dank im Voraus (dies ist auch meine erste Frage auf SO - ich hoffe nicht außerhalb der Richtlinien verstärkt haben!).

Antwort

1

Ja, fühlt sich das falsch uns auch :-)

Wir haben eine Verbesserung im Auge (https://github.com/realm/realm-dotnet/issues/647), so dass man nicht darauf zurückgreifen müssen.

In Bezug auf Ihre Fragen:

1) this blog post in ein bisschen Detail geht, ich weiß nicht, ob das Ihnen hilft. Wenn Sie spezifischere Fragen haben, zögern Sie nicht zu fragen.

2) Lange lebte Transaktionen ein Antipattern aus einem Grunde, in Realm sowie in SQL-Datenbanken sind. Der aktualisierte Status wird nicht beibehalten, bis die Transaktion festgeschrieben wird, sodass Ihr Benutzer möglicherweise Arbeit verliert, wenn die Transaktion viele Änderungen enthält und Ihre App abstürzt. Darüber hinaus greifen andere Threads, die versuchen zu lesen, auf die alte Version zu und wenn sie versuchen zu schreiben, werden sie blockiert, bis die Transaktion festgeschrieben wird.

+1

Vielen Dank! Ich habe diesen Blogeintrag gesehen und habe festgestellt, dass die Transaktion für eine (potentiell) lange Zeit gehalten wurde. dies jetzt beheben ich eine RealmObject des Ladens denke, kopieren ihre Werte an eine unmanged Instanz, deren Eigenschaften können nach Belieben geschrieben werden, dann später über Realm.Manage() innerhalb einer Schreibtransaktion wieder anbringen. eine Realm.Unmanage() -Methode Mit praktisch wäre, so kann ich ein Objekt nur laden, Realm fragen sie in Ruhe zu lassen, so Eigenschaft schreibt nicht scheitern dann später Realm bitten, es wieder in Schreibtransaktion zu verwalten, bei der seine Werte zeigen würde beibehalten werden. –