MST

星途 面试题库

面试题:MySQL AND与OR逻辑优化及事务处理

在一个银行转账的业务场景中,有两个表`accounts`(包含`account_id`、`balance`等字段)和`transactions`(包含`transaction_id`、`from_account_id`、`to_account_id`、`amount`等字段)。现在要实现一个转账操作,从`from_account_id`账户扣除`amount`金额,同时在`transactions`表插入一条记录,并且确保只有当账户余额足够(即余额大于等于`amount`)且转账操作成功(两个表的操作都成功)时,整个操作才生效。请使用MySQL事务结合AND与OR逻辑来编写存储过程实现该功能,并详细说明在事务处理过程中AND与OR操作符的逻辑应用及异常处理机制。
33.3万 热度难度
数据库MySQL

知识考点

AI 面试

面试题答案

一键面试
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操作符的逻辑应用

  • 在本存储过程中,并没有直接使用ANDOR操作符,但逻辑上存在类似的判断。核心判断是余额是否足够以及两个表的操作都要成功。
    • 余额判断使用IF语句,只有当账户余额大于等于amount时才继续后续操作,这类似于AND逻辑中的前置条件判断,如果余额不足,整个操作将回滚,后续操作不会执行。
    • 两个表的操作成功是通过事务机制保证的。在事务中,所有操作要么全部成功(类似于AND逻辑,只有所有条件都满足才提交事务),要么全部失败(只要有一个操作失败,就回滚事务)。

异常处理机制

  • 使用DECLARE exit handler for sqlexception来捕获SQL异常。一旦捕获到异常,就会执行ROLLBACK语句回滚事务,撤销之前对数据库的修改。然后通过SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '转账操作失败';抛出一个自定义的错误信息,告知调用者转账操作失败。
  • 在余额不足的情况下,也会执行ROLLBACK语句回滚事务,并抛出'余额不足,转账失败'的错误信息。