大数据开发面试必背:事务
·
事务的定义
事务是数据库操作中的逻辑单元,包含一组操作(如插入、更新、删除),这些操作要么全部成功执行,要么全部失败回滚。其核心目标是确保数据一致性,尤其在并发操作中维护数据的正确性。
事务的四大特性(ACID)
原子性(Atomicity)
事务是不可分割的最小单元,所有操作要么全部成功,要么全部回滚。
场景示例:电商订单处理中,扣减库存、生成订单、支付扣款必须全部成功,否则回滚到初始状态。
一致性(Consistency)
事务执行前后,数据库必须满足预定义的规则(如主键唯一、字段约束)。
场景示例:ETL 数据同步时,确保数仓中的用户年龄字段非负,否则终止事务。
隔离性(Isolation)
并发事务之间互不干扰,各自独立执行。
场景示例:多个 Flink 任务并发写入 HBase,隔离性避免数据覆盖或重复写入。
持久性(Durability)
事务提交后,修改永久生效,即使系统故障也不丢失。
场景示例:MySQL 数据同步到 ClickHouse 后,即使集群重启,数据仍可恢复。
ACID 分工总结
- 原子性 + 持久性:解决操作有效性(成功/回滚,成功不丢)。
- 一致性:解决数据合法性(符合业务规则)。
- 隔离性:解决并发安全性(多任务不冲突)。
事务控制命令
-- 开启事务
BEGIN;
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;
大数据扩展(Flink 两阶段提交)
tx.begin(); // 开启事务
writeDataToSink(); // 写入数据
tx.commit(); // 提交事务(失败时调用 tx.rollback())
事务隔离级别与并发问题
三大并发问题
- 脏读:读取到其他事务未提交的临时数据(可能回滚)。
示例:报表查询读到未提交的临时金额,后续回滚导致数据错误。 - 不可重复读:同一事务内多次读取同一行数据,值被其他事务修改。
示例:实时监控任务两次查询库存,结果因其他事务扣减而变化。 - 幻读:同一事务内多次查询,返回的行数因其他事务增删而变化。
示例:统计活跃用户数时,其他事务新增用户导致结果不一致。
区分技巧
- 脏读:读未提交的无效数据。
- 不可重复读:同一行数据值被修改。
- 幻读:符合条件的行数变化。
四种隔离级别
| 隔离级别 | 脏读 | 不可重复读 | 幻读 | 适用场景 |
|---|---|---|---|---|
| 读未提交 | ✅ | ✅ | ✅ | 临时日志查看(低准确性需求) |
| 读已提交 | ❌ | ✅ | ✅ | 实时报表(Oracle 默认) |
| 可重复读 | ❌ | ❌ | ✅ | ETL 同步(MySQL 默认) |
| 串行化 | ❌ | ❌ | ❌ | 财务对账(高安全性需求) |
性能权衡
隔离级别越高,安全性越强,但并发性能越低。大数据场景通常选择能满足需求的最低级别。
面试追问答案
MySQL 与 Oracle 默认隔离级别差异
- MySQL:默认可重复读,优先保证数据一致性(适合高并发读写)。
- Oracle:默认读已提交,优先保证并发效率(适合高频查询)。
大数据事务 vs 传统数据库事务
- 传统事务:单机实现,基于磁盘日志(如 Redo Log)。
- 大数据事务:分布式实现,依赖两阶段提交(2PC)或预写日志(WAL),需解决网络延迟与节点故障。
避免幻读的方法
- 串行化隔离级别(效率低)。
- MySQL 可重复读中使用 Next-Key Locking 或 MVCC。
- 大数据场景通过分区锁、时间戳版本控制实现。
更多推荐
所有评论(0)