Concurrencia y transacciones - script 2008

From Ibbddunq

(Difference between revisions)
Line 15: Line 15:
1. non-repeatable read y su consecuencia respecto de los UPDATE.
1. non-repeatable read y su consecuencia respecto de los UPDATE.
Ponele una transacción que agrega una encomienda para un único servicio
Ponele una transacción que agrega una encomienda para un único servicio
-
<code>
+
  PROCEDURE `cargarEncomienda1`(elCliente varchar(45), elPeso integer, elServicio integer)
-
PROCEDURE `cargarEncomienda1`(elCliente varchar(45), elPeso integer, elServicio integer)
+
  BEGIN
-
 
+
    declare nroNuevaEncomienda integer;
-
BEGIN
+
    declare cargaRestanteNueva integer;
-
  declare nroNuevaEncomienda integer;
+
    
-
  declare cargaRestanteNueva integer;
+
    select max(nroEncomienda) + 1 from encomienda into nroNuevaEncomienda;
-
 
+
    select cargaRestante - elPeso from servicio
-
   select max(nroEncomienda) + 1 from encomienda into nroNuevaEncomienda;
+
        where nroServicio = elServicio into cargaRestanteNueva;
-
  select cargaRestante - elPeso from servicio where nroServicio = elServicio into cargaRestanteNueva;
+
    
-
   insert into encomienda(nroEncomienda,cliente,peso,precioAsegurado) values
+
    insert into encomienda(nroEncomienda,cliente,peso,precioAsegurado) values
-
      (nroNuevaEncomienda, elCliente, elPeso, peso*20);
+
        (nroNuevaEncomienda, elCliente, elPeso, peso*20);
-
  update servicio set cargaRestante = cargaRestante - elPeso where nroServicio = elServicio;
+
    insert into encomiendaEnServicio(nroEncomienda,nroServicio) values
-
  insert into encomiendaEnServicio(nroEncomienda,nroServicio) values
+
        (nroNuevaEncomienda, elServicio);
-
      (nroNuevaEncomienda, elServicio);
+
 
-
END
+
    update servicio set cargaRestante = cargaRestanteNueva where nroServicio = elServicio;
-
</code>
+
  END
    
    
2. phantom read.
2. phantom read.
 +
dos destinos, devuelve el que tiene más servicios.
 +
Line 44: Line 46:
Las 4 características
Las 4 características
* Atomicidad: la garantiza el motor.
* Atomicidad: la garantiza el motor.
-
* Consistencia: la debe garantizar uno haciendo operaciones correctas en cada transacción.
+
* Consistencia: la debe garantizar uno haciendo operaciones correctas en cada transacción. P.ej.
 +
** si agrego una fila en encomienda, debo agregar al menos una en encomiendaEnServicio
 +
** si agrego una fila en encomiendaEnServicio, debo actualizar una fila en servicio.
* Durabilidad: la garantiza el motor.
* Durabilidad: la garantiza el motor.
* Aislamiento: necesita un tratamiento particular.
* Aislamiento: necesita un tratamiento particular.
Line 55: Line 59:
-
==Intro a transacciones==
+
==Aparte interesante: problema de los numeradores==
 +
 
 +
Por qué no conviene
 +
  select max(nroEncomienda) + 1 from encomienda into nroNuevaEncomienda for update;
 +
(traba toda la tabla, probar)
 +
 
 +
==A acomodar==
 +
 
 +
Lockeo optimista para transacciones largas: pantalla de edición de datos de un servicio.

Revision as of 17:07, 7 November 2008

Contents

Esquema de BD de ejemplo

encomienda <nroEncomienda, cliente, peso, precioAsegurado>
servicio <nroServicio, origen, destino, partida, llegada, cargaRestante>
encomiendaEnServicio <nroServicio, nroEncomienda>


Intro a concurrencia

BDs monousuario y multiusuario.

Anomalías de concurrencia

1. non-repeatable read y su consecuencia respecto de los UPDATE. Ponele una transacción que agrega una encomienda para un único servicio

 PROCEDURE `cargarEncomienda1`(elCliente varchar(45), elPeso integer, elServicio integer)
 BEGIN
   declare nroNuevaEncomienda integer;
   declare cargaRestanteNueva integer;
 
   select max(nroEncomienda) + 1 from encomienda into nroNuevaEncomienda;
   select cargaRestante - elPeso from servicio
        where nroServicio = elServicio into cargaRestanteNueva;
 
   insert into encomienda(nroEncomienda,cliente,peso,precioAsegurado) values
       (nroNuevaEncomienda, elCliente, elPeso, peso*20);
   insert into encomiendaEnServicio(nroEncomienda,nroServicio) values
       (nroNuevaEncomienda, elServicio);
 
   update servicio set cargaRestante = cargaRestanteNueva where nroServicio = elServicio;
 END
  

2. phantom read. dos destinos, devuelve el que tiene más servicios.


Intro a transacciones

Idea de transacción de negocios.

Idea de transacción en una BD.

Las 4 características

  • Atomicidad: la garantiza el motor.
  • Consistencia: la debe garantizar uno haciendo operaciones correctas en cada transacción. P.ej.
    • si agrego una fila en encomienda, debo agregar al menos una en encomiendaEnServicio
    • si agrego una fila en encomiendaEnServicio, debo actualizar una fila en servicio.
  • Durabilidad: la garantiza el motor.
  • Aislamiento: necesita un tratamiento particular.

Demarcación - BEGIN / COMMIT / ROLLBACK.

Intercalado de transacciones - schedule

Serialización - costo de la serialización - necesidad de encontrar buenos equilibrios.


Aparte interesante: problema de los numeradores

Por qué no conviene

 select max(nroEncomienda) + 1 from encomienda into nroNuevaEncomienda for update;

(traba toda la tabla, probar)

A acomodar

Lockeo optimista para transacciones largas: pantalla de edición de datos de un servicio.

Personal tools