| 
					 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');  |