EF núcleo de concurrencia cuando el uso de varias instancias

0

Pregunta

Tengo un código similar a este:

var records = db.Records.Where(r => r.IsProcessing == false).Take(100).ToList();
records.IsProcessing = true;
await db.SaveChangesAsync()
...further work with recods

Si este código se ejecuta en varias instancias de un microsevice, puede una concurrencia problema suceder? (I. e. dos servicios se consigue el mismo conjunto de registros). Y si la respuesta es sí ¿cómo prevenirla?

Quiero evitar que mi servicios de llegar mismos registros de la bd si ellos llaman a este método de forma simultánea.

2

Mejor respuesta

1

Usted podría recuperar las filas con un procedimiento almacenado que se ejecuta en una transacción serializable. Usted podría querer de los demás atributos de la tabla, algo así como AssignedTo que registra el servicio asignado a esa fila, y otro atributo que indica el tratamiento se ha completado. De lo contrario, si el servicio se recupera algunos filas, pero no antes de completar todo el proceso, las filas permanecen sin procesar. Cuando un servicio recupera las filas, se puede utilizar una condición como AssignedTo = auto O AssignedTo Es Nulo. Presumiblemente, existe también una marca de tiempo o de alguna otra manera para dar prioridad a las filas seleccionadas.

2021-11-23 23:26:52
1

Sí, lo hará, y puede que no sea tan fácil de prevenir.

Imaginar estos servicios se encargan de actualizar los saldos de la cuenta. Leer el equilibrio, y agregar la cantidad de depósito en ella:

service 1: on a busy machine (slow)
service 2: on a not so busy machine (fast)
"john" has £100 on his account
service 1: read
service 2: read
service 1: balance = balance + 100;
service 2: balance = balance + 100;
service 2: set processing = true
service 2: set processing = true
service 2: update record
service 1: update record.
john ends up with £200 instead of £300.

Usted tendrá que introducir un ámbito de transacción, gestionar con redis tal vez, de modo que cada instancia tiene un punto de verdad para comprobar si es ok para entrar y salir de la actualización en el ámbito de aplicación. Un "IsProcessing? o SetIsProcessing" a través de la red, si se quiere.

2021-11-23 21:26:46

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................