So sperren Sie eine Zeile in Entity Framework vollständig

8

Ich arbeite mit einer Situation, in der es um Geldtransaktionen geht.

Zum Beispiel habe ich eine Tabelle mit Benutzer-Brieftaschen mit ihrem Kontostand in dieser Zeile.

%Vor%

Jetzt in unserer Website und Web-Services, müssen wir jedes Mal, wenn eine bestimmte Transaktion passiert,:

  1. Überprüfen Sie, ob genügend Mittel verfügbar sind, um diese Transaktion durchzuführen:
  2. zieht die Kosten der Transaktion vom Saldo ab.

Wie und was ist der richtige Weg, diese Zeile / Entity für die gesamte Dauer meiner Transaktion zu sperren?

Nach dem, was ich gelesen habe, gibt es einige Lösungen, bei denen EF eine Entität markiert und diese Markierung dann vergleicht, wenn sie in der DB gespeichert wird. Was macht sie aber, wenn ein anderer Benutzer / Programm den Betrag bereits bearbeitet hat?

Kann ich das mit EF erreichen? Wenn nicht, welche anderen Optionen habe ich?

Würde das Aufrufen einer gespeicherten Prozedur es mir möglicherweise ermöglichen, die Zeile ordnungsgemäß zu sperren, sodass niemand auf diese Zeile im SQL Server zugreifen kann, während das Programm A die Sperre hat?

    
Zapnologica 18.11.2014, 19:33
quelle

3 Antworten

9

EF verfügt nicht über einen integrierten Sperrmechanismus. Wahrscheinlich müssen Sie eine rohe Abfrage wie

verwenden %Vor%     
Max Brodin 18.11.2014 19:36
quelle
4

Der springende Punkt einer Transaktionsdatenbank ist, dass der Konsument der Daten bestimmt, wie isoliert ihre Ansicht der Daten sein sollte.

Unabhängig davon, ob Ihre Transaktion serialisiert ist, kann jemand anderes Führen Sie ein schmutziges Lesen der Daten durch, die Sie gerade geändert haben, aber nicht festgeschrieben haben.

Sie sollten sich zuerst mit der Integrität Ihrer Sichtweise befassen und dann nur eine Verschlechterung der Qualität dieser Sichtweise akzeptieren, um die Systemleistung dort zu verbessern, wo Sie sicher sind, dass dies erforderlich ist.

Wrap alles in einem TransactionScope mit Serialized Isolationsstufe und Sie persönlich können nicht wirklich falsch liegen. Lassen Sie die Isolationsstufe nur dann fallen, wenn Sie feststellen, dass sie wirklich erforderlich ist (d. H., Wenn Fehler manchmal in Ordnung sind).

Jemand fragt dazu hier: SQL Server: verhindert schmutzig liest eine gespeicherte Prozedur ein

    
briantyler 18.11.2014 19:50
quelle
4

Sie können isolationlevel für die Transaktion im Entity-Framework festlegen, um sicherzustellen, dass niemand anders es ändern kann:

%Vor%

WiederholbarLesen Zusammenfassung: Sperren werden auf allen Daten platziert, die in einer Abfrage verwendet werden, sodass andere Benutzer die Daten nicht aktualisieren können. Verhindert nicht wiederholbare Lesevorgänge, aber Phantomzeilen sind weiterhin möglich.

    
jen b 18.11.2014 20:10
quelle