Mysql存储过程在java中不工作
我的mysql过程工作得很好,但有时当我从java类调用它时,它会挂起 我的mysql过程如下Mysql存储过程在java中不工作,java,mysql,Java,Mysql,我的mysql过程工作得很好,但有时当我从java类调用它时,它会挂起 我的mysql过程如下 DELIMITER $$ DROP PROCEDURE IF EXISTS `expense`.`user_updation`$$ CREATE DEFINER=`root`@`%` PROCEDURE `user_updation`(IN `I_user_id` VARCHAR(10), IN `I_USER_PASSWORD` VARCHAR(200), OUT `o_error_flag`
DELIMITER $$
DROP PROCEDURE IF EXISTS `expense`.`user_updation`$$
CREATE DEFINER=`root`@`%` PROCEDURE `user_updation`(IN `I_user_id` VARCHAR(10), IN `I_USER_PASSWORD` VARCHAR(200), OUT `o_error_flag` VARCHAR(1), OUT `o_error_msg` VARCHAR(100), OUT `o_user_email` VARCHAR(50))
begin
declare v_user_password1 varchar(200);
declare v_user_password2 varchar(200);
declare v_user_password3 varchar(200);
declare v_user_password4 varchar(200);
declare v_user_password varchar(200);
declare v_user_email varchar(50);
declare v_rec_status varchar(50);
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
SET O_ERROR_FLAG = 'E';
SET O_ERROR_MSG = 'UNKNOWN EXCEPTION IN SQL EXECUTION, CONTACT SYSTEM ADMINISTRATOR...';
END;
DECLARE EXIT HANDLER FOR 1205
BEGIN
ROLLBACK;
SET O_ERROR_FLAG = 'E';
SET O_ERROR_MSG = 'RECH_AUTHOR-RECORD IS LOCKED BY SOME OTHER USER, TRY AFTER SOME TIME';
END;
select STATUS into v_rec_status from user_m where USER_NAME=I_user_id;
IF v_rec_status='X'
THEN
SET O_ERROR_FLAG = 'E';
SET O_ERROR_MSG='USER IS INACTIVE IN SYSTEM';
ELSE
SET AUTOCOMMIT=0;
SET O_ERROR_FLAG = 'S';
SET O_ERROR_MSG = 'SUCCESSFULLY';
select EMAIL_ID,password,USER_LAST_PASSWORD_1,USER_LAST_PASSWORD_2,USER_LAST_PASSWORD_3,USER_LAST_PASSWORD_4
INTO v_user_email,v_user_password,v_user_password1,v_user_password2,v_user_password3,v_user_password4 from user_m where user_NAME=I_user_id limit 1;
SET o_USER_EMAIL=v_user_email;
update user_m set
PASSWORD=I_USER_PASSWORD,
USER_LAST_PASSWORD_1=v_user_password,
USER_LAST_PASSWORD_2=v_user_password1,
USER_LAST_PASSWORD_3=v_user_password2,
USER_LAST_PASSWORD_4=v_user_password3,
USER_LAST_PASSWORD_5=v_user_password4,
LAST_PASSWORD_DATE=Date(now()),
ACCOUNT_STATUS='U',
FORCED_PASSWORD_FLAG='Y',
PASS_COUNT=0
where user_name=I_user_id ;
END IF;
end$$
DELIMITER ;
Java类是
public String setpassword(Procedurecall pro,String userid, String pass) throws SQLException
{
System.out.println(userid);
System.out.println(pass);
try { Connection connection;
connection = template.getDataSource().getConnection();
CallableStatement callableStatement = connection.prepareCall("{call user_updation(?, ?, ?,?,?)}");
callableStatement.setString(1, userid);
callableStatement.setString(2, pass);
callableStatement.registerOutParameter(3, Types.VARCHAR);
callableStatement.registerOutParameter(4, Types.VARCHAR);
callableStatement.registerOutParameter(5, Types.VARCHAR);
callableStatement.executeUpdate();
String is_error = callableStatement.getString(3);
String msg = callableStatement.getString(4);
String email = callableStatement.getString(5);
pro.setIs_error(is_error);
pro.setMsg(msg);
pro.setEmail(email);
System.out.println("-------------------------Procedure return status "+is_error+"-------------------- Message "+msg);
return is_error;
}
catch(Exception e)
{
System.out.println("===========================Internal Server Error==========" +e);
return "400";
}
}
运行java代码时,不会显示任何错误,也不会执行任何更新。程序不起作用。
所以我试着直接调用这个过程
call user_updation('shah1234','passwordisgood',@f,@m,@e);
select @f,@m,@e;
错误消息是
RECH_AUTHOR-RECORD IS LOCKED BY SOME OTHER USER, TRY AFTER SOME TIME
这个错误实际上是错误的
Lock wait timeout exceeded. Try restarting transaction.
而且,如果我尝试更新任何其他表,我会得到相同的错误,似乎我不能使用任何DML查询。
论使用
显示全局变量,如“innodb\u回滚\u超时”代码>
我把关了
。我想解决办法是打开它,我使用的是wampp,我检查了mysql.ini。我在那里找不到变量UseSHOW ENGINE INNODB STATUS代码>查看导致锁定的原因结果是type->Innodb,但名称和状态为空,使用显示全局变量,如“Innodb\u rollback\u on\u timeout”代码>我下车。我想解决办法是打开它,我使用的是wampp,我检查了mysql.ini。我在那里找不到变量现在我重新启动了服务器,再次调用该过程不起作用,所以我执行了很多次commit
,现在该过程只有在直接调用时才起作用,如果我再次从java调用它,问题将再次开始。您有一个设置AUTOCOMMIT=0代码>在过程中没有提交/自动提交=1。除非您在其他地方提交,否则最终将回滚/在其他会话中可能不可见/将锁定行,直到提交/回滚。。。这可能解释了(某些)观察到的行为代码>查看导致锁定的原因结果是type->Innodb,但名称和状态为空,使用显示全局变量,如“Innodb\u rollback\u on\u timeout”代码>我下车。我想解决办法是打开它,我使用的是wampp,我检查了mysql.ini。我在那里找不到变量现在我重新启动了服务器,再次调用该过程不起作用,所以我执行了很多次commit
,现在该过程只有在直接调用时才起作用,如果我再次从java调用它,问题将再次开始。您有一个设置AUTOCOMMIT=0代码>在过程中没有提交/自动提交=1。除非您在其他地方提交,否则最终将回滚/在其他会话中可能不可见/将锁定行,直到提交/回滚。。。这可以解释(某些)观察到的行为。