事务的定义

事务是数据库操作中的逻辑单元,包含一组操作(如插入、更新、删除),这些操作要么全部成功执行,要么全部失败回滚。其核心目标是确保数据一致性,尤其在并发操作中维护数据的正确性。


事务的四大特性(ACID)

原子性(Atomicity)

事务是不可分割的最小单元,所有操作要么全部成功,要么全部回滚。
场景示例:电商订单处理中,扣减库存、生成订单、支付扣款必须全部成功,否则回滚到初始状态。

一致性(Consistency)

事务执行前后,数据库必须满足预定义的规则(如主键唯一、字段约束)。
场景示例:ETL 数据同步时,确保数仓中的用户年龄字段非负,否则终止事务。

隔离性(Isolation)

并发事务之间互不干扰,各自独立执行。
场景示例:多个 Flink 任务并发写入 HBase,隔离性避免数据覆盖或重复写入。

持久性(Durability)

事务提交后,修改永久生效,即使系统故障也不丢失。
场景示例:MySQL 数据同步到 ClickHouse 后,即使集群重启,数据仍可恢复。

ACID 分工总结

  • 原子性 + 持久性:解决操作有效性(成功/回滚,成功不丢)。
  • 一致性:解决数据合法性(符合业务规则)。
  • 隔离性:解决并发安全性(多任务不冲突)。

事务控制命令

-- 开启事务
BEGIN;
-- 提交事务
COMMIT;
-- 回滚事务
ROLLBACK;

大数据扩展(Flink 两阶段提交)

tx.begin();          // 开启事务
writeDataToSink();   // 写入数据
tx.commit();         // 提交事务(失败时调用 tx.rollback())

事务隔离级别与并发问题

三大并发问题
  1. 脏读:读取到其他事务未提交的临时数据(可能回滚)。
    示例:报表查询读到未提交的临时金额,后续回滚导致数据错误。
  2. 不可重复读:同一事务内多次读取同一行数据,值被其他事务修改。
    示例:实时监控任务两次查询库存,结果因其他事务扣减而变化。
  3. 幻读:同一事务内多次查询,返回的行数因其他事务增删而变化。
    示例:统计活跃用户数时,其他事务新增用户导致结果不一致。

区分技巧

  • 脏读:读未提交的无效数据。
  • 不可重复读:同一行数据值被修改。
  • 幻读:符合条件的行数变化。
四种隔离级别
隔离级别脏读不可重复读幻读适用场景
读未提交临时日志查看(低准确性需求)
读已提交实时报表(Oracle 默认)
可重复读ETL 同步(MySQL 默认)
串行化财务对账(高安全性需求)

性能权衡
隔离级别越高,安全性越强,但并发性能越低。大数据场景通常选择能满足需求的最低级别。


面试追问答案

MySQL 与 Oracle 默认隔离级别差异
  • MySQL:默认可重复读,优先保证数据一致性(适合高并发读写)。
  • Oracle:默认读已提交,优先保证并发效率(适合高频查询)。
大数据事务 vs 传统数据库事务
  • 传统事务:单机实现,基于磁盘日志(如 Redo Log)。
  • 大数据事务:分布式实现,依赖两阶段提交(2PC)或预写日志(WAL),需解决网络延迟与节点故障。
避免幻读的方法
  1. 串行化隔离级别(效率低)。
  2. MySQL 可重复读中使用 Next-Key Locking 或 MVCC。
  3. 大数据场景通过分区锁、时间戳版本控制实现。

更多推荐