Duilioisola te recomiendo que cambies las excepciones de captura de error por esta :
Código Delphi
[-]
except
on E: Exception do
begin
Transaccion.Rollback; Application.MessageBox( PChar( E.Message ), 'Error de SQL', MB_ICONSTOP );
end;
end;
Puesto que estás dejando abierta la transacción (y los registros bloqueados) hasta que el usuario acepta el mensaje de error. Y no hay ninguna necesidad de ello (imagínate que el usuario mantiene el mensaje en pantalla, para poder llamar al servicio técnico. Igual te deja media hora con los registros bloqueados).
Siempre se debería evitar que las transacciones (especialmente las que ya han modificado algo) permanezcan abiertas a la espera de una acción del usuario.
Saludos.