1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
/* Ejercicio 29: Realizar un procedimiento que teniendo en cuenta el procedimiento transac6 del apartado 6.10.5 de los materiales implemente otro procedimiento similar pero utilizando la estrategia optimista, que asume que es muy poco probable que el valor de una fila que se acaba de leer con intención de modificarla un tiempo más tarde cambie antes de poder hacerlo; en ese caso como mínimo habrá que asegurarse de que la fila no ha sido modificada después de haber sido leída y si así ha sido entonces la transacción no debe llevarse a cabo aun pudiéndose realizar (ROLLBACK). */ delimiter $$ drop procedure if exists 1x29 $$ create procedure 1x29( p_id int, p_alumno varchar(30) ) begin declare textoError tinytext; declare todoOk boolean default true; declare v_alumno varchar(30); declare v_antes_id int; declare v_antes_alumno varchar(30); declare continue handler for sqlexception begin set textoError = "Sql Exception"; set todoOk = false; end; -- Se hace una copia del contenido antes de la transaccion: select id, alumno into v_antes_id, v_antes_alumno from alumnos where id = p_id; START TRANSACTION; -- select sleep(20); -- Se hace la actualizacion si los datos son los mismos que los obtenidos anteriormente: if (select true from alumnos where id = v_antes_id and alumno = v_antes_alumno) then update alumnos set id = p_id, alumno = p_alumno where id = v_antes_id and alumno = v_antes_alumno; else set textoError = "Los datos no eran los mismos, no se ha realizo la modificacion."; set todoOk = false; end if; if todoOk then commit; else select textoError; rollback; end if; end $$ delimiter ; -- call 1x29( 2, 'Pedro'); |