面试题答案
一键面试1. 事务生命周期概述
SQLite 事务从开启到结束,经历开启事务、执行一系列数据库操作(如插入、更新、删除等),最后通过提交(成功时)或回滚(失败时)来结束事务。
2. 开启事务
- 隐式开启:在某些情况下,SQLite 会隐式开启事务。例如,当执行
INSERT
,UPDATE
,DELETE
等修改数据的语句时,如果当前没有活动事务,SQLite 会自动开启一个事务。这种隐式事务在语句执行完毕后会自动提交。 - 显式开启:使用
BEGIN
或BEGIN TRANSACTION
语句显式开启一个事务。这允许你将多个数据库操作组合成一个逻辑单元。例如:
BEGIN;
INSERT INTO users (name, age) VALUES ('Alice', 30);
UPDATE users SET age = 31 WHERE name = 'Alice';
COMMIT;
3. 提交事务
- 操作:使用
COMMIT
语句来提交事务。当调用COMMIT
时,事务中所有已执行的数据库操作将被永久保存到数据库文件中。例如:
BEGIN;
INSERT INTO products (product_name, price) VALUES ('Widget', 10.99);
UPDATE products SET price = 11.99 WHERE product_name = 'Widget';
COMMIT;
- 适用场景:当事务中的所有操作都成功完成,且希望将这些更改持久化到数据库时,使用
COMMIT
。比如在一个转账操作中,从账户 A 扣除金额和向账户 B 添加金额都成功执行后,提交事务使更改生效。
4. 回滚事务
- 操作:使用
ROLLBACK
语句来回滚事务。ROLLBACK
会撤销自事务开始以来所有已执行的数据库操作,将数据库恢复到事务开始前的状态。例如:
BEGIN;
DELETE FROM orders WHERE order_id = 123;
-- 发现操作有误,回滚
ROLLBACK;
- 适用场景:当事务执行过程中发生错误(如违反唯一性约束、数据类型不匹配等),或者业务逻辑判断某些操作不应该继续执行时,使用
ROLLBACK
。例如,在一个复杂的订单处理事务中,如果库存检查发现商品库存不足,就回滚整个订单创建事务,避免错误订单数据残留。
5. 自动提交模式
- SQLite 默认处于自动提交模式,即每条单独的 SQL 语句都被视为一个单独的事务。例如,执行一条
INSERT
语句时,SQLite 会隐式开启一个事务,执行完INSERT
后立即提交该事务。但在需要确保多个操作原子性(要么全部成功,要么全部失败)时,需要显式开启事务并控制提交或回滚。