Ir al contenido


Foto

¿Cómo evitar el deadlock o conflicto al actualizar o eliminar un registro en Firebird?


  • Por favor identifícate para responder
23 respuestas en este tema

#21 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 27 abril 2017 - 07:37

Tal cual como propones en el post #14.

 

Saludos.


  • 0

#22 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 01 junio 2017 - 08:19

Saludos.

 

Gracias enecumene por el feedback. Solo por curiosidad para que otros puedan aprovecharse de esta situación, ¿Cómo quedó el código del SP?

 

Perdón Rolphy, pero de todos modos, aunque no me marca error, nos hemos dado cuenta de que no está descontando o sumando, estuve viendo sobre MERGE, no sé qué tan efectivo es:


sql
  1. MERGE INTO stock USING buy ON stock.item_id = buy.item_id
  2. WHEN MATCHED THEN UPDATE SET balance = balance + buy.volume WHEN
  3. NOT MATCHED THEN INSERT VALUES (buy.item_id, buy.volume);

¿Hay alguna otra forma?


  • 0

#23 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 01 junio 2017 - 08:33

Por si las moscas, el SP quedó así:


sql
  1. CREATE OR ALTER PROCEDURE ACTUALIZA_STOCK (
  2. SALIDA INTEGER,
  3. TIPO VARCHAR(3))
  4. AS
  5. DECLARE variable ID_INSUMO INTEGER;
  6. DECLARE variable CANTIDAD FLOAT;
  7. BEGIN
  8. FOR SELECT sad.ins_cantidad, ins.ins_id FROM insumos ins
  9. JOIN salidas_almacen_detalles sad ON ins.ins_id = sad.is_id
  10. WHERE sad.sal_id = :salida FOR UPDATE INTO :cantidad, :id_insumo do
  11. BEGIN
  12. IF (:tipo = 'in') THEN
  13. UPDATE insumos SET ins_existencia = ins_existencia + :cantidad WHERE ins_id = :id_insumo;
  14. IF (:tipo = 'out') THEN
  15. UPDATE insumos SET ins_existencia = ins_existencia - :cantidad WHERE ins_id = :id_insumo;
  16. /*suspend;*/
  17. END
  18. END


  • 0

#24 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 01 junio 2017 - 10:25

Me acabo de dar cuenta que me he equivocado en la forma en que he estructurado el inventario, lo he hecho con la mentalidad de un sistema monousuario, que en la tabla de productos tenemos un campo que muestra la cantidad en existencia y se actualiza directamente, por eso el deadlock, en realidad lo que debí hacer ó debería de hacer era una tabla aparte con el id del producto, cantidad y tipo de saldo, algo así:

 

ID     cant   tipo

1       11     salida

2       2       devolucion

50     9       salida

345   500   Entrada

 

ahi se va insertando todos los movimientos (me Faltó poner la fecha así poder hacer cortes), así separamos lo que es consulta y actualizaciones, porque siempre será un insert.

 

Ya tengo suficiente trabajo que hacer.

 

Saludos.


  • 2




IP.Board spam blocked by CleanTalk.