2016-08-23 4 views
1

Wie erhalte ich ein Update, Exclusive lock? Artikel states, dass "ein Benutzer nach einer Update-Sperre anstelle der Shared-Sperre fragen kann", aber ich habe keine Möglichkeit gefunden, den Sperrentyp anzugeben.Wie erhalte ich eine bestimmte Sperre?

Derzeit habe ich ein Wörterbuch, das Listen speichert. Mein Ziel ist: wenn jemand nur die Liste liest - machen wir einen Schnappschuss und blockieren niemanden sonst. Wenn jemand die Liste ändert - nehmen wir eine Exclusive-Sperre oder vielleicht eine Update-Sperre (ehrlich gesagt kann ich keinen Unterschied finden) und alle anderen sollten warten, bis die Transaktion läuft, sogar Lesevorgänge sollten nicht möglich sein. Das Detail, das ich nicht verstehen kann, ist: wie man das spezifiziert, wenn die Absicht nur zu lesen ist, als das Lesen der Sammlung zu erlauben, und wann Absicht ist, zu lesen und dann zu schreiben (wir sind nicht in der Lage, existierende zu ändern) Daten auf andere Weise), dann sollte diese Transaktion alle Sperren warten und erst dann die Sammlung erfolgreich lesen und ändern.

+0

Würde ein [ConcurrentDictionary] (https://msdn.microsoft.com/en-us/library/dd997369 (v = vs.110) ASPX) in Ihrem Szenario arbeiten? –

+0

@AndrewMorton, nein, ConcurentDictionary dient einem anderen Zweck ist nicht für verteilte Systeme geeignet. Selbst wenn es eine geeignete zuverlässige Sammlung gäbe, würde ich gerne Dinge mit Sperren und Transaktionen herausfinden. – cassandrad

Antwort

2

Es gibt eine Enumeration LOCKMODE genannt, die Sie einige Methoden auf zuverlässige Wörterbücher und Warteschlangen passieren können, die es Ihnen ermöglichen, gewünschte die Funktionalität zu spezifizieren. Afaik, die einzigen Methoden, die es unterstützen, sind TryGetValue und ContainsKey für Wörterbücher und TrypPeek für Warteschlangen. Ich bin durch diesen Artikel selbst verwirrt worden, da ich ursprünglich davon überzeugt war, dass ich es per Transaktion spezifizieren könnte (was übrigens toll wäre). Im Moment sind Ihre Möglichkeiten mit LockMode eher begrenzt.

+0

Weitere Informationen über Sperren für SF https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-reliable-services-reliable-collections-transactions-locks –

1

So habe ich mein Problem beim Lesen und Schreiben gelöst.

Update-Sperre funktioniert nicht so, wie ich es erwartet habe, es dauert immer Exklusiv-Sperre und es ist momentan nicht möglich, eine andere Operation zum Sammeln durchzuführen (einschließlich Lesen), wenn Sie ein Element desselben Schlüssels aktualisieren .

Aber es ist möglich Lesevorgang Lock-frei zu machen - Sie müssen nur aus sekundären Replikaten lesen. Natürlich werden Sie in diesem Fall wahrscheinlich keine tatsächlichen Daten erhalten, aber es ist immer noch besser als nichts und TimeoutException.

Dennoch gleichzeitiges Schreiben auf das gleiche Element ist ziemlich langsam, und Sie müssen sorgfältig wiederholen Politik denken, wenn Sie Update-Daten wollen auch mit Timeout.

+0

Was Snapshot Isolation ?, I denke, es aus den Secondaries lesen könnte Dateninkonsistenz verursachen. – sotn

Verwandte Themen