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存儲過程執行一半出現異常會怎麼辦
如果在存儲過程調用的時候顯式的調用了事務處理,那麼,會回滾,否則執行到那裡就在哪裡生效。