Concurrencia y transacciones - script 2008
From Ibbddunq
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 | ||
- | + | 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; |
- | + | ||
- | + | 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; |
- | + | ||
- | insert into encomienda(nroEncomienda,cliente,peso,precioAsegurado) values | + | 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. | 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: | ||
- | == | + | ==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.