error en mysql al ejecutar un procedimiento almacenado desde java

estos errores son los que me genera al tratar de ejecutar un procedimineto almacenado en mysql desde java

java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction

si hago la consulta directamente en mysql no me genera ningun errror
ya lo probe con una funcion pero lo que hace es trabar el programa que estoy haciendo. si laguien me pudiera ayudar

esta es la funcion que trate de ejecutar en primer lugar

DELIMITER //
CREATE FUNCTION f_Cambio_nip(P_Numero_Tarjeta    VARCHAR(10),
                             P_Nip_Nuevo INT
                             )
RETURNS INT
DETERMINISTIC
BEGIN
  DECLARE V_Realizacion  INT;
  DECLARE V_Nuevo_Nip    INT;

  #actializa el nip de la tarjeta ingresada
  UPDATE tarjeta
  SET
    NIP = P_Nip_Nuevo
  WHERE
    NUM_TARJETA = P_Numero_Tarjeta;

  # consulta que al nuevo nip
  SET V_Nuevo_Nip = (SELECT nip
                     FROM
                       tarjeta
                     WHERE
                       NUM_TARJETA = P_Numero_Tarjeta);

  #confirma si el nip fue actualizado
  SET V_realizacion = if(V_Nuevo_Nip = P_Nip_Nuevo, 1, 0);

   #realiza el registro del movimiento en la tabla movimientos
   INSERT INTO movimientos VALUES ('', 'Cambio de NIP',
                                   
                                   (SELECT curdate()),
                                     
                                      (SELECT ID_CUENTA
                                      FROM
                                      tarjeta
                                      WHERE
                                      NUM_TARJETA = P_Numero_Tarjeta),
                         
                                     (SELECT id_tarjeta
                                      FROM
                                      tarjeta
                                      WHERE
                                      NUM_TARJETA = P_Numero_Tarjeta),
     
                                     '', '6');

  RETURN V_Realizacion;
END//

y posteriormente lo probe con uste procedimiento almacenado

DELIMITER //

CREATE PROCEDURE Cambio_De_NIP(IN  P_Numero_Tarjeta VARCHAR(10),
                               IN  P_Nip_Nuevo      INT,
                               OUT P_Confirmacion   VARCHAR(20)
                               )
BEGIN

  DECLARE retribucion INT;

  SET retribucion = (SELECT f_Cambio_nip2(P_Numero_Tarjeta, P_Nip_Nuevo));

  #confirma si el nip fue actualizado
  SET P_Confirmacion = if(retribucion = P_Nip_Nuevo, 'Cambio realizado', 'Cambio no realizado');

   #realiza el registro del movimiento en la tabla movimientos
   INSERT INTO movimientos VALUES ('', 'Cambio de NIP',
                                   
                                   (SELECT curdate()),
                                     
                                      (SELECT ID_CUENTA
                                      FROM
                                      tarjeta
                                      WHERE
                                      NUM_TARJETA = P_Numero_Tarjeta),
                         
                                     (SELECT id_tarjeta
                                      FROM
                                      tarjeta
                                      WHERE
                                      NUM_TARJETA = P_Numero_Tarjeta),
     
                                     '', '6');

END
//

pero solo funcionan desde mysql directamente y cuando los mando desde java solo traba el programa y en el caso del procedimiento despues de un cierto tiempo manda el error que se menciona la inicio

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de JaimeItlzc

Transaccion

Puede ser que otra transacción este bloqueando al procedimiento.

Imagen de neko069

Y el código Java?

Y el código Java?

if (e.getSource() ==

if (e.getSource() == aceptar_nipmodificado) {  // donde aceptar _nipmodificado es un boton

 modelo_cuentas.cambio_nip(Integer.parseInt(valor_newnip.getText()));  // donde modelo cuentas es una clase que contiene la instruccion para  ejecutar el procedimiento y el valor_newnip.gettext(); es para obtener el valor desde la interfaz y es el valor que le mandare al procedimiento como parametro
}

//esto pertenece a modelo_cuentas que es lo que esta arriba
public void cambio_nip(int nip_nuevo) {

try {
            control.ejecutarProcedimientoAlmacenado(parametro);
            control.commit();
        } catch (SQLException ex) {
            System.out.println("imprime el error");
            ex.printStackTrace();
            Logger.getLogger(clase_modelo_cuentas.class.getName()).log(Level.SEVERE, null, ex);
        }
}

por ultimo esto pertenece a control y es donde ejecuta el procedimiento almacenado

  public String ejecutarFuncion(String funcion) throws SQLException {
        ResultSet rows;
        Statement s = conexion.createStatement();
        System.out.println("C: SQL [ SELECT " + funcion + " AS resultado ]");
        rows = s.executeQuery("SELECT " + funcion + " AS resultado");
        rows.next();
        return rows.getString("resultado");
    }

gracias por sus comentarios y espero que me puedan ayudar

Imagen de beto.bateria

y el codigo de

y el codigo de createStatement? y el de ejecutarProcedimientoAlmacenado?