Loading

Fehler "Zeile kann nicht gesperrt werden - Datensatz derzeit nicht verfügbar"

Veröffentlichungsdatum: Apr 1, 2022
Beschreibung
Wenn ein Datensatz aktualisiert oder erstellt wird, wird dieser Datensatz mit einer Sperre versehen, um zu verhindern, dass eine andere Operation den Datensatz zur gleichen Zeit aktualisiert und damit Inkonsistenzen in den Daten verursacht. 

Diese Sperren halten normalerweise einige Sekunden lang, und wenn die Sperre aufgehoben wird, können andere Operationen die gewünschte Bearbeitung des betreffenden Datensatzes durchführen. Eine bestimmte Transaktion kann jedoch nur maximal 10 Sekunden auf die Freigabe einer Sperre warten, da sie sonst eine Zeitüberschreitung verursacht.

 
Lösung

Wann und wo Datensätze gesperrt werden, hängt von der Operation ab, die Sie durchführen, und vom Hauptdatensatz, an dem Sie arbeiten. Das Force.com-Cheatsheet zum Sperren von Datensätzen enthält detaillierte Informationen dazu, und es wird dringend empfohlen, dass Sie sich mit seinem Inhalt vertraut machen.

 

a. Email-To-Case

Wenn eine E-Mail von email-to-case verarbeitet wird, werden Trigger auf dem E-Mail-Nachrichten-Objekt oder verwandten Objekten (d.h. dem übergeordneten Konto) versuchen, diese Datensätze für die Verarbeitung zu sperren. Wenn ein anderer Prozess diese Datensätze sperrt und die Verarbeitung der E-Mail länger als 10 Sekunden warten muss, tritt ein Timeout auf und Sie sehen diesen Fehler.
 

b. Apex Triggers/API
Angenommen, es gibt einen After Insert Apex-Trigger bei Aufgaben, und er läuft etwa 14 Sekunden lang, während er einige Verarbeitungen durchführt. Dieser Trigger wird ausgeführt, wenn eine Aufgabe erstellt wird. Wenn Aufgaben erstellt werden und mit einem Konto verknüpft sind, sperren wir das übergeordnete Konto, während die Aufgabe erstellt wird. Das bedeutet, dass das Konto nicht aktualisiert werden kann, während die Aufgabenerstellung läuft. Reduzieren Sie die Verwendung von Locking Statements.

Szenario:
  1. Benutzer A importiert eine Aufgabe über den Data Loader und ordnet sie einem vorhandenen Account-Datensatz zu. Wenn die Aufgabe hinzugefügt wird, wird der Apex-Trigger ausgelöst.
  2. Nur 2 Sekunden, nachdem Benutzer A das Hinzufügen über den Data Loader gestartet hat, bearbeitet Benutzer B manuell denselben Account-Datensatz, auf den sich die Aufgabe bezieht.
  3. Wenn Benutzer B auf "Speichern" klickt, wird intern versucht, eine Sperre auf das Konto zu setzen, aber das Konto ist bereits gesperrt, so dass keine weitere Sperre gesetzt werden kann. Das Konto war bereits bei der Erstellung der Aufgabe gesperrt worden

Die 2. Transaktion wartet dann darauf, dass die Sperre aufgehoben wird. Da das Anlegen der Aufgabe etwa 14 Sekunden dauert, wird die Sperre 14 Sekunden lang gehalten. Die zweite Transaktion (von Benutzer B) schaltet sich aus, da sie nur maximal 10 Sekunden warten kann.

In diesem Fall würde Benutzer B auf dem Bildschirm einen ähnlichen Fehler wie den oben genannten sehen. Apex-Tests können auch Sperren verursachen, wenn sie gegen Produktionsdaten ausgeführt werden.

c. Bulk API 

Das Einfügen oder Aktualisieren von Datensätzen über die Bulk-API kann mehrere Aktualisierungen desselben übergeordneten Datensatzes auf einmal verursachen, da die Batches parallel verarbeitet werden. Wenn beispielsweise zwei Batches gleichzeitig verarbeitet werden und die beiden Batches Datensätze enthalten, die auf denselben übergeordneten Datensatz verweisen, versucht einer der Batches, eine Sperre im übergeordneten Datensatz zu setzen, was dazu führen kann, dass der andere Batch den Fehler "Zeile nicht sperrbar" auslöst, da der Batch nicht in der Lage war, innerhalb von 10 Sekunden eine Sperre zu erzielen.

Um dies zu verhindern, können Sie eine der folgenden Optionen anwenden:
  • Verringern Sie die Batchgröße
  • Verarbeiten Sie die Datensätze nicht parallel, sondern seriell, d.h. es wird jeweils ein Batch auf einmal verarbeitet..
  • Sortieren Sie die Hauptdatensätze auf der Grundlage ihres Stammdatensatzes, um zu vermeiden, dass bei Verwendung der Parallelverarbeitung verschiedene Unterdatensätze (mit demselben Stammdatensatz) in verschiedenen Batches vorhanden sind.

Für diese Art von Szenarien wird außerdem dringend empfohlen, dass Sie sich mit den Richtlinien vertraut machen, die in diesem Artikel zu finden sind 


d. Master-detail Relationship

Wenn ein Datensatz auf der Master-Seite einer Master-Detail-Beziehung zu viele Child-Datensätze (Tausende) hat, werden Sie wahrscheinlich ebenfalls auf diese Fehler stoßen, da der Stammsatz jedes Mal, wenn Sie den Detailsatz bearbeiten, gesperrt wird. Je mehr Detailsätze Sie haben, desto wahrscheinlicher ist es, dass diese von Benutzern bearbeitet werden, was dazu führt, dass der Stammsatz gesperrt wird. 

Um dieses Problem zu vermeiden, können Sie einige untergeordnete Datensätze in einen anderen übergeordneten Datensatz verschieben, um die Anzahl der an einen einzelnen übergeordneten Datensatz angehängten untergeordneten Datensätze zu reduzieren. 


Das Sperren auf Datensatzebene kommt häufig vor und kann verhindert werden. 
 


Fehlerbehebung: 

1. Sie können Debug-Protokolle für den Benutzer, der den Fehler erhält, aktivieren, um den fehlerhaften Trigger/Flow/ValidationRules/die Ursache des Problems zu finden.

2. Überprüfen Sie, ob abhängige Hintergrundjobs, die auf demselben Objekt laufen, vorhanden sind. Wenn es welche gibt, versuchen Sie, die Jobs anzuhalten und dann die Aktionen zum Reduzieren von Zeilensperren durchzuführen.

Nummer des Knowledge-Artikels

000387767

 
Laden
Salesforce Help | Article