Seguramente sabes que para modificar una fila debes usar el comando UPDATE, pero ¿sabes cuál es la manera correcta de usar ese comando?

Veamos.

Tenemos una aplicación que muchos usuarios usan al mismo tiempo y al hacerlo están actualizando la misma fila de la misma tabla.

Nuestra transacción es READ COMMITTED, RECORD_VERSION, NO WAIT

¿Cómo actualizamos esa fila?

Opción 1. Obtener un valor, modificarlo, y actualizarlo

  • Con un SELECT obtienes el valor que te interesa
  • Modificas ese valor
  • Realizas el UPDATE

Opción 2. Actualizar de una sola vez

  • UPDATE MiTabla

Listado 1.

UPDATE
   MiTabla
SET
   MiColumna = MiColumna + :MiNuevoValor
WHERE
   MiCondición;

¿Es preferible usar la Opción 1. o la Opción 2.?

Si usas la Opción 1. entonces entre el SELECT y el UPDATE una transacción concurrente pudo haber modificado el valor que obtuviste con el SELECT. En consecuencia, tu tabla tendrá un valor erróneo aunque a simple vista parecerá que está todo bien.

Lo correcto es usar la Opción 2. porque en ese caso el Firebird de forma implícita bloqueará a la fila y así el valor guardado siempre estará bien.

La Opción 1. solamente puede usarse si nunca dos o más usuarios estarán modificando la misma fila de la misma tabla al mismo tiempo. Si puede ocurrir que dos o más usuarios la estén modificando al mismo tiempo, siempre hay que usar la Opción 2.

Artículos relacionados:

El índice del blog Firebird21

El foro del blog Firebird21

Anuncios