当前位置:首页 » 存储配置 » mysql存储过程异常回滚

mysql存储过程异常回滚

发布时间: 2024-12-24 10:22:07

A. 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

这个死锁估计是有数据没了, 或者某个操作被回滚了

要避免这个问题方法有很多

  1. 事务尽量不要太复杂

  2. 在使用表或者行的时候, 尽量设定一个顺序, 比如同一时间段线程A 竞争 1 2 资源, 线程 B 竞争 2 1 资源出现死锁, 如果改成 A 使用 1 2 B 也是使用的 1 2 , 这样再差也只会出现线程A/B去等待线程B/A执行完毕再去访问资源

  3. 将一些容易出现死锁的字段改成索引, 这样在竞争资源的时候mysql将不再上锁[doge]

  4. 如果你是mysql数据库, 则尽量避免使用 insert ... select 这样的sql(oracle不用), 因为他会为你需要查询的条件也上锁, 这样也会容易出现死锁的问题

  5. 捕获异常, 然后在出现这个异常的时候再次执行一次死锁的sql语句

  6. 待续, 我也没遇到更多的出现死锁的情况了, 等遇到再说

以上几点如果有错的话, 请指出, 我们相互探讨, 毕竟这也是我从笔记里面找出来的, 可能有错误

G. mysql存储过程执行一半出现异常会怎么办

如果在存储过程调用的时候显式的调用了事务处理,那么,会回滚,否则执行到那里就在哪里生效。

热点内容
汽车配置怎么看马力 发布:2024-12-25 00:23:49 浏览:83
ipad访问权限 发布:2024-12-25 00:23:01 浏览:690
rxjava上传 发布:2024-12-25 00:22:59 浏览:306
如何用安卓机注销一个苹果id 发布:2024-12-25 00:22:57 浏览:993
python统计字符个数 发布:2024-12-25 00:22:12 浏览:541
我的世界服务器鞘翅怎么合成 发布:2024-12-25 00:21:22 浏览:799
网页版360云服务器地址 发布:2024-12-25 00:15:59 浏览:383
传奇手游脚本吧 发布:2024-12-25 00:14:00 浏览:169
服务器voc是什么 发布:2024-12-25 00:12:21 浏览:995
查看java环境变量 发布:2024-12-25 00:03:27 浏览:140