面试题答案
一键面试常见启动事务的语句
BEGIN
:开启一个事务块。例如:
BEGIN;
-- 事务内的SQL语句
COMMIT;
START TRANSACTION
:也用于启动事务,它还可以带有一些事务选项,如隔离级别等。例如:
START TRANSACTION ISOLATION LEVEL READ COMMITTED;
-- 事务内的SQL语句
COMMIT;
银行转账场景确保数据一致性
假设存在两个账户 account1
和 account2
,分别有余额 balance1
和 balance2
,要从 account1
向 account2
转账 amount
金额。
BEGIN;
-- 检查account1余额是否足够
SELECT balance INTO @balance1 FROM accounts WHERE account_name = 'account1';
IF @balance1 >= amount THEN
-- 更新account1余额
UPDATE accounts SET balance = balance - amount WHERE account_name = 'account1';
-- 更新account2余额
UPDATE accounts SET balance = balance + amount WHERE account_name = 'account2';
COMMIT;
ELSE
ROLLBACK;
END IF;
在上述代码中:
- 首先使用
BEGIN
开启事务。 - 从数据库中查询
account1
的余额,并判断余额是否足够转账。 - 如果足够,则更新
account1
和account2
的余额,最后使用COMMIT
提交事务,确保数据持久化。 - 如果余额不足,则使用
ROLLBACK
回滚事务,撤销之前在事务内执行的所有操作,保证数据一致性。