Loading

No se puede desbloquear una fila - Errores de registro no disponible en estos momentos

Fecha de publicación: Apr 1, 2022
Descripción

Cuando se actualiza o se crea un registro, colocamos un bloqueo en ese registro para evitar que otra operación actualice el registro al mismo tiempo y provoque incoherencias en los datos.

Estos bloqueos normalmente tardan solo unos segundos y cuando se levanta el bloqueo, otras operaciones pueden realizar el procesamiento que se supone que tienen que hacer en el registro en cuestión. No obstante, una transacción específica solo puede esperar un máximo de 10 segundos para la liberación de un bloqueo, y en caso contrario agotará su tiempo de espera.

Solución

Qué registros y el momento en que se bloquean dependen de la operación que esté realizando y el registro principal en el que esté trabajando. La Hoja de referencia de bloqueo de registros de Force.com proporciona información detallada sobre este punto y es altamente recomendada para que se familiarice con su contenido.

Escenarios comunes que evitan el desbloqueo de un registro

 

a. Correo electrónico para registro de casos

Cuando un mensaje de correo electrónico se procesa por parte de Correo electrónico para registro de casos, los desencadenadores en el objeto del mensaje de correo electrónico o los objetos relacionados (por ej. la cuenta principal) intentarán bloquear esos registros para su procesamiento. Si otro registro está manteniendo un bloqueo sobre estos registros y el procesamiento del mensaje de correo electrónico tiene que esperar más de 10 segundos, se producirá un agotamiento del tiempo de espera y verá este error.
 

b. Desencadenadores de Apex/API

Suponga que hay un desencadenador Después de insertar Apex en Tareas, y se ejecuta durante 14 segundos aproximadamente mientras realiza su procesamiento. Este desencadenador se ejecutará cuando se cree una tarea. Cuando las tareas se crean y se relacionan con una cuenta, colocamos un bloqueo en la cuenta principal mientras se está creando la tarea. Estos significa que la cuenta no puede actualizarse mientras la creación de la tarea está en curso.
Reduzca utilizando instrucciones de bloqueo.

Escenario:
  1. El Usuario A importa una tarea a través del Cargador de datos y la asigna a un registro de cuenta existente. Cuando se inserta la tarea, se inicia el desencadenador de Apex.
  2. Dos segundos después de que el Usuario A inicie la inserción a través del Cargador de datos, el Usuario B empieza a modificar manualmente el mismo registro de cuenta con el que la tarea está relacionada.
  3. Cuando el Usuario B hace clic en Guardar, intentamos colocar internamente un bloqueo en la cuenta, pero la cuenta ya está bloqueada, por lo que no podemos hacerlo. La cuenta ya ha sido bloqueada por la creación de la tarea.

La segunda transacción espera entonces que se levante el bloqueo. Debido a que la tarea tarda aproximadamente 14 segundos en crearse, el bloqueo se mantiene durante 14 segundos. La segunda transacción (del Usuario B) agota su tiempo de espera, ya que solo puede esperar un máximo de 10 segundos.

En este caso, el Usuario B debería ver un error en la pantalla similar a los mencionados anteriormente. Las pruebas de Apex también pueden colocar bloqueos si se ejecutan sobre datos de producción.

c. API masiva

La inserción o actualización de registros a través de la API masiva puede provocar múltiples actualizaciones en el registro principal al mismo tiempo, porque los lotes se procesan en paralelo. Por ejemplo, si hay dos lotes procesándose al mismo tiempo y los dos contienen registros que apuntan al mismo registro principal, uno de los lotes intentará colocar un bloqueo en el registro principal, lo que podría llevar al otro lote a la lanzar un error "no se puede bloquear fila", ya que el lote no pudo obtener un bloqueo en el plazo de 10 segundos.

Para evitar esto, puede realizar una de las opciones siguientes:
  • Reducir el tamaño de los lotes.
  • Procesar los registros en modo serie en vez de paralelo, para que los lotes se procesen uno tras otro.
  • Ordenar los registros en base a su registro principal, para evitar tener registros secundarios diferentes (con el mismo principal) en lotes diferentes cuando se utiliza el modo paralelo. 

Para estos tipos de escenarios, también se recomienda encarecidamente que se familiarice con las directrices que se encuentran en este artículo 


d. Relación principal-detalle

Si un registro en el lado principal de una relación principal-detalle tiene demasiados registros secundarios (miles), es probable que se presenten estos errores, ya que cada vez que modifica el registro de detalle, el registro principal está bloqueado. Cuantos más registros de detalle tenga, más probabilidades habrá de que los usuarios los modifiquen, lo que provoca que se bloquee el registro principal. 

Para evitar este problema podrá trasladar algunos registros secundarios a otro principal, para reducir la cantidad de registros secundarios adjuntos a un único registro principal. 
El bloqueo a nivel de registros es un escenario común que puede reducirse.


Solución de problemas: 

1. Puede activar Registros de depuración para el usuario que se esté encontrando el error para encontrar el desencadenador/flujo/regla de validación que está provocando el problema.

2. Compruebe si hay trabajos en segundo plano dependientes que se estén ejecutando sobre el mismo objeto. Si los hubiera, pruebe a poner en pausa los trabajos y luego realice las acciones para reducir bloqueos de filas. 


Bloqueo y concurrencia de registros de Salesforce Platform
 
Número del artículo de conocimiento

000387767

 
Cargando
Salesforce Help | Article