DELIMITER //
CREATE PROCEDURE transfer_funds(
IN from_account INT,
IN to_account INT,
IN transfer_amount DECIMAL(10, 2)
)
BEGIN
DECLARE current_balance DECIMAL(10, 2);
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
-- 回滚事务
ROLLBACK;
-- 记录错误日志
INSERT INTO error_logs (error_message, error_time)
VALUES (CONCAT('转账失败,错误信息:', SQLERRM), NOW());
-- 抛出异常
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '转账操作出现错误,已回滚';
END;
-- 开启事务
START TRANSACTION;
-- 检查转出账户是否存在
IF NOT EXISTS (SELECT 1 FROM accounts WHERE account_id = from_account) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '转出账户ID无效';
END IF;
-- 检查转入账户是否存在
IF NOT EXISTS (SELECT 1 FROM accounts WHERE account_id = to_account) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '转入账户ID无效';
END IF;
-- 获取转出账户余额
SELECT balance INTO current_balance FROM accounts WHERE account_id = from_account;
-- 检查余额是否充足
IF current_balance < transfer_amount THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = '转出账户余额不足';
END IF;
-- 更新转出账户余额
UPDATE accounts
SET balance = balance - transfer_amount
WHERE account_id = from_account;
-- 更新转入账户余额
UPDATE accounts
SET balance = balance + transfer_amount
WHERE account_id = to_account;
-- 插入交易记录
INSERT INTO transactions (from_account_id, to_account_id, amount)
VALUES (from_account, to_account, transfer_amount);
-- 提交事务
COMMIT;
END //
DELIMITER ;
- 存储过程定义:
CREATE PROCEDURE transfer_funds
定义了一个名为transfer_funds
的存储过程,接受三个参数:from_account
(转出账户ID),to_account
(转入账户ID),transfer_amount
(转账金额)。
- 异常处理:
DECLARE EXIT HANDLER FOR SQLEXCEPTION
定义了一个异常处理程序,当出现SQL异常时,它会执行以下操作:
- 回滚事务,确保数据一致性。
- 向
error_logs
表插入错误信息和当前时间。
- 抛出一个自定义异常,提示转账操作出现错误。
- 事务处理:
START TRANSACTION
开启一个事务。
- 一系列的
IF
语句检查转出账户和转入账户是否存在,以及转出账户余额是否充足。如果任何一个条件不满足,就抛出异常,触发异常处理程序。
- 满足条件后,更新转出账户和转入账户的余额,并插入一条交易记录。
- 最后
COMMIT
提交事务,确保所有操作的原子性。