mysql存储过程异常回滚
一般默认情况是会回滚的,但是如果你修改了My.ini文件里面的安全级别就不一定了。
B. 如何 mysql 存储过程返回值
mysql中要获得存储过程的返回值,可以增加一个out参数,用来返回。
mysql中存储过程的例子:
CREATE PROCEDURE addvoucher (
IN userid INT,
IN voucherid INT,
OUT result INT
)
BEGIN
SELECT
@endate_a := endate ,@batch_a := batch ,@c_count_a := c_count,
@isdead_a := isdead
FROM
t_voucher
WHERE
id = voucherid;
SET autocommit = 0;
IF EXISTS (
SELECT
*
FROM
t_user_voucher tuv,
t_voucher tv
WHERE
tv.id = tuv.voucherid
AND tv.batch =@batch_a
) THEN
SET result = 1;-- 已存在
SELECT
result;
ELSE
IF @c_count_a > 0 THEN
IF (
TO_DAYS(@endate_a) - TO_DAYS(NOW())
) > 0 THEN
IF @isdead_a = 1 THEN
INSERT INTO t_user_voucher (userid, voucherid, isdead)
VALUES
(userid, voucherid, 1);
UPDATE t_voucher SET c_count = c_count-1 where id = voucherid;
SET result = 0;-- 成功
END;
C. mysql 多条语句,怎么判断其中一条执行错误,就执行回滚
写一个存储过程,在存储过程里写一个事物,再把你要的mysql 多条语句写在事物里面就行了,要用的时候调用一下存储过程.大致格式是这样的:
drop procere if exists accessCount;
delimiter $
create procere accessCount()
BEGIN
DECLARE t_error INTEGER DEFAULT 0;/*设置错误增量*/
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1;
START TRANSACTION;/*开启事物*/
xxxx(你的语句)
IF t_error = 1 THEN /*执行失败回滚*/
ROLLBACK;
ELSE
COMMIT;
END IF;
end $
delimiter ;
D. mysql 存储过程中update影响行数为0,回滚
使用FOUND_ROWS() 获得影响的行数,再用IF判断是否等于0就行了。
--开始事务
starttransaction;
callsetCoin(zjAmount,0,`uid`,liqType,`type`,info,_betId,serializeId,'');
updateblast_betssetlotteryNo=_kjData,zjCount=_zjCount,bonus=zjAmount,fanDianAmount=_fanDianAmountSelfwhereid=_betId;
IFFOUND_ROWS()=0THEN
ROLLBACK;
ELSE
COMMIT;
ENDIF;
commit;
E. mysql 存储过程 异常 是否自动 回滚
是滴,默认是隐式的开始与提交,出现异常会默认自动回滚到开始位置,任何一个使用JDBC操作数据库的SQL命令,在默认情况下,隐式开始与提交事务。当显示的调用事物时,就必须显示使用commit当使用rollback后也要进行commit;
F. MYSQL 存储过程报错Deadlock found when trying to get lock; try restarting transaction
这个死锁估计是有数据没了, 或者某个操作被回滚了
要避免这个问题方法有很多
事务尽量不要太复杂
在使用表或者行的时候, 尽量设定一个顺序, 比如同一时间段线程A 竞争 1 2 资源, 线程 B 竞争 2 1 资源出现死锁, 如果改成 A 使用 1 2 B 也是使用的 1 2 , 这样再差也只会出现线程A/B去等待线程B/A执行完毕再去访问资源
将一些容易出现死锁的字段改成索引, 这样在竞争资源的时候mysql将不再上锁[doge]
如果你是mysql数据库, 则尽量避免使用 insert ... select 这样的sql(oracle不用), 因为他会为你需要查询的条件也上锁, 这样也会容易出现死锁的问题
捕获异常, 然后在出现这个异常的时候再次执行一次死锁的sql语句
待续, 我也没遇到更多的出现死锁的情况了, 等遇到再说
以上几点如果有错的话, 请指出, 我们相互探讨, 毕竟这也是我从笔记里面找出来的, 可能有错误
G. mysql存储过程执行一半出现异常会怎么办
如果在存储过程调用的时候显式的调用了事务处理,那么,会回滚,否则执行到那里就在哪里生效。