Loading

Errori Impossibile bloccare la riga - Record attualmente non disponibile

Data pubblicazione: Apr 1, 2022
Descrizione

Quando un record è in corso di aggiornamento o di creazione, il record viene bloccato per evitare che un'altra operazione lo aggiorni nello stesso momento, causando incoerenze nei dati.

Tali blocchi di solito durano pochi secondi e, quando il blocco viene rilasciato, altre operazioni possono eseguire l'elaborazione prevista sul record in questione. Una transazione, tuttavia, può attendere il rilascio di un blocco solo per 10 secondi al massimo, dopo di che si verifica un timeout.

Risoluzione

I record da bloccare e il momento di attivazione del blocco dipendono dall'operazione in esecuzione e dal record principale su cui si sta lavorando. In Force.com Record Locking Cheatsheet (Foglio riassuntivo sul blocco dei record di Force.com) offre informazioni dettagliate su questo punto ed è consigliabile acquisire familiarità con il contenuto di questo documento.

Scenari comuni che impediscono lo sblocco di un record

 

a. Email a caso

Quando un'email viene elaborata tramite Email a caso, i trigger nell'oggetto messaggio email o in oggetti correlati (ad esempio l'account controllante) tentano di bloccare i record interessati per eseguire l'elaborazione. Se un altro processo sta bloccando questi record e l'elaborazione dell'email deve rimanere in attesa per più di 10 secondi, si verifica un timeout e viene visualizzato questo errore.
 

b. Trigger/API Apex

Si supponga che un trigger Apex "after insert" (successivo a inserimento) su operazioni effettui un'elaborazione per circa 14 secondi. Questo trigger è in esecuzione quando viene creata un'operazione. Durante la creazione di operazioni e la correlazione di queste a un account, l'account controllante viene bloccato. Questo significa che mentre la creazione dell'operazione è in corso, l'account non può essere aggiornato.
Ridurre l'utilizzo di istruzioni di blocco.

Scenario:
  1. L'utente A importa un'operazione tramite Data Loader e la assegna a un record account esistente. Quando l'operazione viene inserita, viene attivato il trigger Apex.
  2. Appena 2 secondi dopo che l'utente A ha avviato l'inserimento mediante Data Loader, l'utente B modifica manualmente lo stesso record account a cui è correlata l'operazione.
  3. Quando l'utente B fa clic su Salva, viene tentato internamente il blocco dell'account, che però è già bloccato. Non è quindi possibile attivare un altro blocco. L'account era già stato bloccato dalla creazione dell'operazione.

La seconda transazione, quindi, attende che il blocco venga rimosso. Poiché, tuttavia, la creazione dell'operazione richiede circa 14 secondi, il blocco viene mantenuto per 14 secondi. La seconda transazione (eseguita dall'utente B) genera un timeout, perché può attendere per un massimo di 10 secondi.

In questo caso, l'utente B visualizzerebbe sullo schermo un errore simile a quelli citati in precedenza. Anche i test Apex possono subire blocchi se vengono eseguiti su dati di produzione​.

c. API in blocco 

L'inserimento o l'aggiornamento di record tramite l'API in blocco può causare più aggiornamenti allo stesso record controllante contemporaneamente, perché i batch vengono elaborati in parallelo. Ad esempio, se due batch vengono elaborati contemporaneamente ed entrambi contengono record che puntano allo stesso record controllante, uno dei batch tenterà di bloccare il record controllante. Questo può causare la generazione dell'errore "Impossibile bloccare la riga", dato che il secondo batch non ha potuto eseguire il blocco entro 10 secondi.

Per evitare questo inconveniente, è possibile eseguire una delle operazioni seguenti:
  • Ridurre le dimensioni del batch
  • Elaborare i record in serie anziché in parallelo. In questo modo viene elaborato un batch alla volta.
  • Ordinare i record principali in base al rispettivo record controllante, per evitare di avere record secondari diversi (con lo stesso record controllante) in batch diversi quando si utilizza la modalità in parallelo. 

Per questi tipi di scenario, si consiglia inoltre di acquisire familiarità con le linee guida disponibili in questo articolo 


d. Relazione record principale-record dettaglio

Se per un record sul lato record principale di una relazione record principale-record dettaglio è presente un numero eccessivo di record secondari (nell'ordine delle migliaia), anche in questo caso è probabile che si verifichino questi errori, poiché ogni volta che si modifica il record dettaglio il record principale viene bloccato. Maggiore è il numero dei record dettaglio, maggiore è la probabilità che questi vengano modificati dagli utenti, causando il blocco del record controllante. 

Per evitare questo problema, è possibile passare alcuni record secondari a un altro record controllante, per ridurre il numero di record secondari collegati a un unico record controllante. 
Il blocco a livello di record è uno scenario comune che può essere ridotto.


Risoluzione dei problemi: 

1. È possibile abilitare registri debug per l'utente che riceve l'errore, per individuare il trigger, il flusso o le regole di convalida che causano il problema.

2. Cercare eventuali processi in background dipendenti che sono in esecuzione per lo stesso oggetto. Se vengono individuati processi di questo tipo, sospenderli, quindi eseguire le azioni, per ridurre i blocchi di righe. 


Salesforce Platform Record Locking and Concurrency (Blocco e simultaneità dei record in Salesforce Platform)
 
Numero articolo Knowledge

000387767

 
Caricamento
Salesforce Help | Article