DELIMITER //
CREATE PROCEDURE transfer_money(
IN from_account INT,
IN to_account INT,
IN transfer_amount DECIMAL(10, 2)
)
BEGIN
DECLARE exit handler for sqlexception
BEGIN
-- 捕获异常,回滚事务
ROLLBACK;
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '转账操作失败';
END;
START TRANSACTION;
-- 检查余额是否足够
IF (SELECT balance FROM accounts WHERE account_id = from_account) >= transfer_amount THEN
-- 扣除金额
UPDATE accounts SET balance = balance - transfer_amount WHERE account_id = from_account;
-- 插入交易记录
INSERT INTO transactions (from_account_id, to_account_id, amount)
VALUES (from_account, to_account, transfer_amount);
-- 提交事务
COMMIT;
ELSE
-- 余额不足,回滚事务
ROLLBACK;
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '余额不足,转账失败';
END IF;
END //
DELIMITER ;
AND与OR操作符的逻辑应用
- 在本存储过程中,并没有直接使用
AND
和OR
操作符,但逻辑上存在类似的判断。核心判断是余额是否足够以及两个表的操作都要成功。
- 余额判断使用
IF
语句,只有当账户余额大于等于amount
时才继续后续操作,这类似于AND
逻辑中的前置条件判断,如果余额不足,整个操作将回滚,后续操作不会执行。
- 两个表的操作成功是通过事务机制保证的。在事务中,所有操作要么全部成功(类似于
AND
逻辑,只有所有条件都满足才提交事务),要么全部失败(只要有一个操作失败,就回滚事务)。
异常处理机制
- 使用
DECLARE exit handler for sqlexception
来捕获SQL异常。一旦捕获到异常,就会执行ROLLBACK
语句回滚事务,撤销之前对数据库的修改。然后通过SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '转账操作失败';
抛出一个自定义的错误信息,告知调用者转账操作失败。
- 在余额不足的情况下,也会执行
ROLLBACK
语句回滚事务,并抛出'余额不足,转账失败'
的错误信息。