面试题答案
一键面试import sqlite3
def transfer_money(from_account_id, to_account_id, amount):
try:
# 连接到SQLite数据库
conn = sqlite3.connect('bank.db')
cursor = conn.cursor()
# 开始事务
conn.execute('BEGIN')
# 查询转出账户余额
cursor.execute('SELECT balance FROM accounts WHERE account_id =?', (from_account_id,))
from_balance = cursor.fetchone()
if from_balance is None:
raise ValueError(f"转出账户 {from_account_id} 不存在")
from_balance = from_balance[0]
# 检查转出账户余额是否足够
if from_balance < amount:
raise ValueError(f"转出账户 {from_account_id} 余额不足")
# 更新转出账户余额
new_from_balance = from_balance - amount
cursor.execute('UPDATE accounts SET balance =? WHERE account_id =?', (new_from_balance, from_account_id))
# 查询转入账户余额
cursor.execute('SELECT balance FROM accounts WHERE account_id =?', (to_account_id,))
to_balance = cursor.fetchone()
if to_balance is None:
raise ValueError(f"转入账户 {to_account_id} 不存在")
to_balance = to_balance[0]
# 更新转入账户余额
new_to_balance = to_balance + amount
cursor.execute('UPDATE accounts SET balance =? WHERE account_id =?', (new_to_balance, to_account_id))
# 提交事务
conn.execute('COMMIT')
print(f"从账户 {from_account_id} 成功转账 {amount} 到账户 {to_account_id}")
except sqlite3.Error as e:
# 回滚事务
conn.execute('ROLLBACK')
print(f"SQLite错误: {e}")
except ValueError as ve:
# 回滚事务
conn.execute('ROLLBACK')
print(f"业务错误: {ve}")
finally:
# 关闭数据库连接
if conn:
conn.close()
# 示例调用
transfer_money(1, 2, 100)
上述代码实现了银行转账功能,在转账过程中使用事务确保数据一致性,同时处理了账户不存在、余额不足以及SQLite本身可能出现的错误。transfer_money
函数接受三个参数:转出账户ID (from_account_id
)、转入账户ID (to_account_id
) 和转账金额 (amount
)。在函数内部,通过SQLite核心API完成转账操作,并在出现错误时回滚事务以保证数据一致性。