第4章 并发冲突类型与边界影响

在特征读写并发场景中,多个操作线程或事务同时访问同一份边界数据时,必然产生并发冲突。不同的冲突类型对读边界(数据一致性)、写边界(覆盖保护)以及资源边界(锁与事务管理)产生差异化影响。边界封装的首要前提是识别这些冲突,并针对每种冲突设计相应的隔离策略。

4.1 并发冲突类型全景

根据数据库理论与分布式系统共识,并发冲突可归纳为以下五类。理解每一类的本质、发生场景及边界面上的表现,是封装边界的第一步。

  • 脏读(Dirty Read) — 事务T1读取了事务T2尚未提交的中间数据。随后T2回滚,T1读到的是无效数据。在边界封装中,读边界被削弱,导致下游依赖方获取了“未承诺”的状态。
  • 不可重复读(Non-repeatable Read) — 事务T1内两次读取同一记录,因T2在此期间提交了更新,导致T1两次结果不一致。读边界无法保证“快照一致性”,跨读写边界的查询结果漂移。
  • 幻读(Phantom Read) — 事务T1范围内查询一批记录,T2插入/删除了符合范围条件的记录,导致T1再次查询时出现“新影子”或丢失记录。范围边界被突破,影响游标分页、聚合计算等。
  • 写覆盖(Lost Update / Write-Write Conflict) — 两个事务并发修改同一条记录,后提交的写操作覆盖了先提交的写操作,导致前者丢失。写边界未加锁或乐观锁检测失败,数据完整性受损。
  • 死锁(Deadlock) — 两个或以上事务互相等待对方释放资源,形成循环等待链,系统被迫回滚一方。资源边界失控,直接阻塞服务可用性。

4.2 各冲突类型对边界的影响

下表从边界识别和分层职责角度,给出每种冲突对数据流边界的具体影响,以及典型后果。

冲突类型 核心定义 边界影响 典型后果
脏读 读取未提交数据 读边界无隔离,下游收到临时状态 数据污染、触发错误补偿
不可重复读 同一事务内两次读取结果不同 快照边界失效,读-写边界耦合 报告不一致、缓存失效
幻读 范围查询结果集变动 范围边界被插入/删除穿透 分页错乱、聚合计算错误
写覆盖 后提交覆盖前提交 写边界无版本校验或锁定 数据丢失、业务逻辑错误
死锁 相互等待资源 资源边界锁定顺序错误 事务回滚、服务不可用

4.3 风险点清单

在特征读写边界设计时,以下风险点需要提前标记,并纳入验收标准。

  • 读边界未设置隔离级别:默认 READ UNCOMMITTED 或 READ COMMITTED 可能导致脏读/不可重复读,需根据场景提升至 REPEATABLE READ 或 SERIALIZABLE。
  • 写边界缺少版本号或乐观锁:高并发写覆盖场景下,若无 CAS(Compare And Swap)机制,数据易丢失。
  • 范围查询未加间隙锁:幻读发生概率随分页/批处理操作增大,需使用间隙锁或快照隔离避免。
  • 锁顺序不一致:事务获取多个资源时顺序混乱,极易触发死锁,需在边界封装中显式规定锁获取顺序。
  • 长事务跨多个边界:同时占用读、写、资源边界,放大死锁和连带回滚风险,应尽量将事务拆分为短事务。
死锁预防实践:在边界封装层统一使用“超时 + 重试”策略,所有资源按边界标识哈希排序获取,避免循环等待。验收时应通过混沌工程注入随机锁延迟,验证死锁恢复时效。

4.4 冲突类型与边界影响关系图

下图为五种并发冲突类型与三类边界(读/写/资源)之间的影响映射,帮助设计者快速定位边界封装重点。

并发冲突类型与边界影响关系 并发冲突类型 × 边界影响 脏读 不可重复读 幻读 写覆盖 死锁 读边界 写边界 资源边界 注:幻读同时影响读边界(范围一致性)和写边界(插入/删除),因此用分叉箭头表示。
边界封装提醒:在每一道特征读写的边界上,应显式声明其“允许的冲突容忍度”。例如,读边界可设置为“允许不可重复读但禁止脏读”,写边界必须“禁止写覆盖”,资源边界必须“死锁超时1秒内自动回退”。这些声明将直接指导后续的锁粒度、隔离级别和重试策略选择。