面试题答案
一键面试1. SQLite开启事务、提交事务和回滚事务的SQL语法
- 开启事务:
BEGIN TRANSACTION;
或者
BEGIN;
这两种写法作用相同,都是开始一个新的事务,在事务开始后执行的SQL语句都被视为事务的一部分,直到提交或回滚事务。
- 提交事务:
COMMIT;
当所有需要在事务中执行的操作都成功完成后,使用COMMIT
语句将事务中对数据库所做的修改永久保存到数据库中。
- 回滚事务:
ROLLBACK;
如果在事务执行过程中出现错误或需要撤销之前所做的操作,使用ROLLBACK
语句将事务回滚到事务开始之前的状态,即撤销事务中已经执行的SQL语句对数据库所做的修改。
2. 业务场景举例
除了银行转账业务,以下是一些常见使用事务处理机制的业务场景:
- 电商订单处理: 在电商系统中,当用户下单时,涉及到多个操作,比如减少商品库存、生成订单记录、更新用户积分等。假设用户购买一件商品,商品库存为10,用户下单1件。
BEGIN TRANSACTION;
-- 减少商品库存
UPDATE products SET stock = stock - 1 WHERE product_id = '123';
-- 生成订单记录
INSERT INTO orders (user_id, product_id, quantity) VALUES ('user001', '123', 1);
-- 更新用户积分(假设每消费100元积1分,商品价格100元)
UPDATE users SET points = points + 1 WHERE user_id = 'user001';
COMMIT;
如果在这一系列操作中任何一个步骤出现错误,比如库存不足,就可以使用ROLLBACK
语句回滚整个事务,确保数据库数据的一致性,不会出现库存减少但订单未生成,或者用户积分增加但订单未成功的情况。
- 多表关联数据更新:
假设有一个员工管理系统,员工信息存储在
employees
表,员工部门信息存储在departments
表。当员工调部门时,需要同时更新employees
表中的部门ID和departments
表中的员工数量。
BEGIN TRANSACTION;
-- 更新员工表中的部门ID
UPDATE employees SET department_id = 'new_department_id' WHERE employee_id = '1';
-- 更新部门表中的员工数量(假设旧部门减少1人,新部门增加1人)
UPDATE departments SET employee_count = employee_count - 1 WHERE department_id = 'old_department_id';
UPDATE departments SET employee_count = employee_count + 1 WHERE department_id = 'new_department_id';
COMMIT;
如果在更新过程中出现问题,例如部门表更新失败,使用ROLLBACK
回滚事务,保证员工和部门数据的一致性,避免出现员工在错误部门或者部门员工数量统计错误的情况。