2023 Wave 2 – v23: Feature Tri-State locking in AL

2023 Wave 2 – v23: Característica Bloqueo en AL Tri-Estado

Esta función permite operaciones de lectura optimistas que continuan a operaciones de escritura, en lugar de una concurrencia disminuida y una coherencia rigurosa. De tal manera, los clientes pueden prever un aumento de la concurrencia evitando accesos a datos fallidos con bloqueos.

¿Por qué?

Al analizar los problemas de rendimiento de Business Central, se hace evidente que las interacciones con la base de datos son casi siempre el aspecto más costoso de cualquier operación.

Muchos usuarios cada día obtienen como respuesta errores en sus operaciones debido a la espera de bloqueos de datos. Las estadísticas de SaaS Business Central muestran que la lectura de datos, y no su modificación, representa casi el 50% de todos los bloqueos.

Comportamiento

Las sugerencias de tabla se utilizan en la sentencia del lenguaje de manipulación de datos (DML) para anular el comportamiento predeterminado del optimizador de consultas. Se puede especificar una estrategia de bloqueo, uno o varios índices, una acción de procesamiento de consultas como una búsqueda de índices o un escaneo de tablas, u otras opciones.

Hasta ahora el comportamiento de bloqueo involucraba 2 estados:

Imagen obtenida de esta página y demuestra gráficamente el comportamiento del nivel de aislamiento: https://www.keytogoodcode.com/post/transaction-isolation-in-business-central

Pero es importante considerar que del análisis del código AL actual se desprende que la mayoría de las lecturas que siguen a las escrituras no guardan relación alguna; en la mayoría de los casos, las lecturas y escrituras son conceptualmente distintas entre sí, y con frecuencia afectan a filas diferentes. Por lo que podría considerarse como una forma de tratar las transacciones mejorable.

// locking behavior in versions 22 (and earlier)
trigger OnAction()
var
    currency1: Record Currency;
    currency2: Record Currency;    
begin
    currency1.FindFirst(); // SQL statement use READUNCOMMITTED

    currency1.Code := 'DKK';
    currency1."ISO Code" := 'DKK';
    currency1.Symbol := 'Kr';
    currency1.Insert();

    currency2.FindLast(); // SQL statement use UPDLOCK (so locks data with an exclusive lock)
end;

El nuevo comportamiento de bloqueo añade un tercero estado entre los dos estados anteriores mencionados, considerando entonces 3 estados:

Imagen obtenida de esta página y demuestra gráficamente el comportamiento del nivel de aislamiento: https://www.keytogoodcode.com/post/transaction-isolation-in-business-central

Sin duda, la espera de bloqueos ocupa una gran parte del tiempo de procesamiento, por lo que esta nuevo comportamiento propuesto es sin duda una mejora muy importante.

// locking behaviour with tri-state locking
trigger OnAction()
var
    currency1: Record Currency;
    currency2: Record Currency;    
begin
    currency1.FindFirst(); // SQL statement use READUNCOMMITTED

    currency1.Code := 'DKK';
    currency1."ISO Code" := 'DKK';
    currency1.Symbol := 'Kr';
    currency1.Insert();

    currency2.FindLast(); // SQL statement use READCOMMITTED (so locks data with a shared lock)
end;

Habilitación

Recomendaciones

Es muy probable que algunas de sus extensiones deban ajustarse para que implementen el nuevo comportamiento de bloqueo.

Por lo tanto, se aconseja que pruebe sus extensiones previamente. Para ello, copie el entorno de producción en un sandbox, habilite la funcionalidad, pruebe, revise y realice los ajustes de código necesarios.

Luego con seguridad, habilítelo en producción y mejore el rendimiento de sus transacciones.


Esto se traduce en menos errores e interrupciones por problemas relacionados con el bloqueo, lo que hace que Business Central sea más rápido y fácil de usar.

Quienes tengan conjuntos de datos grandes o complejos o quienes ejecuten operaciones frecuentes e intensivas en sus servicios en línea se beneficiarán especialmente de esta mejora.

Espero que esta información te ayude.


2023 Wave 2 – v23: Feature Tri-State locking in AL

This feature allows optimistic read operations to follow write operations, rather than decreased concurrency and strict consistency. In this way, clients can anticipate an increase in concurrency by avoiding failed data accesses with deadlocks.

¿Why?

When analyzing Business Central performance issues, it becomes apparent that database interactions are almost always the most costly aspect of any operation.

Many users every day experience errors in their operations due to waiting for data locks. SaaS Business Central statistics show that reading data, not modifying it, accounts for almost 50% of all deadlocks.

Behavior

Table hints are used in the Data Manipulation Language (DML) statement to override the default behavior of the query optimizer. You can specify a locking strategy, one or more indexes, a query processing action such as an index lookup or a table scan, or other options.

Up to now, the blocking behavior involved 2 states:

Image obtained from this page and graphically demonstrates the behavior of the isolation level: https://www.keytogoodcode.com/post/transaction-isolation-in-business-central

But it is important to consider that from the analysis of the current AL code it appears that most of the reads following the writes are unrelated; in most cases, reads and writes are conceptually distinct from each other, and often affect different rows. So it could be considered as a way of dealing with transactions that could be improved.

// locking behavior in versions 22 (and earlier)
trigger OnAction()
var
    currency1: Record Currency;
    currency2: Record Currency;    
begin
    currency1.FindFirst(); // SQL statement use READUNCOMMITTED

    currency1.Code := 'DKK';
    currency1."ISO Code" := 'DKK';
    currency1.Symbol := 'Kr';
    currency1.Insert();

    currency2.FindLast(); // SQL statement use UPDLOCK (so locks data with an exclusive lock)
end;

The new blocking behavior adds a third state between the two previous states mentioned, considering then 3 states:

Image obtained from this page and graphically demonstrates the behavior of the isolation level: https://www.keytogoodcode.com/post/transaction-isolation-in-business-central

Undoubtedly, waiting for locks occupies a large part of the processing time, so this new proposed behavior is undoubtedly a very important improvement..

// locking behaviour with tri-state locking
trigger OnAction()
var
    currency1: Record Currency;
    currency2: Record Currency;    
begin
    currency1.FindFirst(); // SQL statement use READUNCOMMITTED

    currency1.Code := 'DKK';
    currency1."ISO Code" := 'DKK';
    currency1.Symbol := 'Kr';
    currency1.Insert();

    currency2.FindLast(); // SQL statement use READCOMMITTED (so locks data with a shared lock)
end;

Enabling

Recommendations

It is very likely that some of your extensions will need to be adjusted to implement the new blocking behavior.

Therefore, it is advised that you test your extensions beforehand. To do this, copy the production environment into a sandbox, enable the functionality, test, review and make the necessary code adjustments.

Then safely enable it in production and improve the performance of your transactions.


This results in fewer errors and interruptions due to blocking-related problems, making Business Central faster and easier to use.

Those with large or complex data sets or those who run frequent and intensive operations on their online services will especially benefit from this enhancement.

I hope this information helps you.


Más información / More information

Deja un comentario