MST
星途 面试题库

面试题:SQLite中事务处理的基本语法及使用场景

请阐述SQLite中开启事务、提交事务和回滚事务的SQL语法。并举例说明在哪些业务场景下会使用事务处理机制,例如银行转账业务。
49.3万 热度难度
数据库SQLite

知识考点

AI 面试

面试题答案

一键面试

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回滚事务,保证员工和部门数据的一致性,避免出现员工在错误部门或者部门员工数量统计错误的情况。