事务“失效”的判定口径 所谓 Spring 事务失效,通常不是事务完全不存在,而是事务边界没有按预期生效:方法执行时没有进入带事务的代理(AOP 代理),或进入了代理但未触发回滚规则,或被错误的传播/数据源/线程模型切断,最终表现为“该回滚没回滚”“该隔离没隔离”“该原子没原子”。 代理没走到:最常...
动态代理(JDK Proxy 或 CGLIB/ByteBuddy 这一类)本质是在“方法调用边界”上做文章:拦截公开方法、织入横切逻辑。私有属性属于对象内部状态,不在代理的可拦截边界上;要“获取”,只能走两条路:通过公开访问路径(推荐)或通过反射/方法句柄强行穿透(有边界与代价)。 代理类型决定“能...
影响 QPS 上限的从来不是“项目”这个抽象名词,而是一串可被度量的瓶颈链:入口(网关/负载均衡)→ 应用线程与连接池 → 下游(缓存/数据库/三方)→ 队列与异步化 → 资源配额(CPU/内存/带宽)→ 降级与限流策略。脱离接口类型、依赖拓扑与硬件规格给出单一数字,基本等同于猜。 先把“QPS”口...
任务(线程)的栈空间分配,本质是操作系统在“虚拟内存”里为每个可调度执行流划出一段连续的地址区间,并配套一套“越界即崩”的保护机制。真正用到的物理内存通常按需分配,不会在创建瞬间一次性占满。 栈是什么:一段受约束的线程私有内存 栈(stack):保存函数调用现场的内存结构,典型内容包括返回地址、局部...
使用双删策略(double delete,常指“先删缓存,再删数据库,并配合延时再删一次缓存”)的核心动机,是在“缓存 + 数据库”的读写分离架构里,把短窗口的不一致压到更低,把“用户看到旧值”的概率压到工程可接受的范围。 不一致从哪里来:并发读写的时间差 典型链路是:读请求先读缓存(Cache),...
在组件树里,状态从上往下传是默认单向流;子控件想“更改外部传入的状态”,本质做法是:让父组件仍然拥有状态所有权(Single Source of Truth),子组件只负责触发变更。工程上常用三种实现路径。 1)回调上抛:父持有状态,子触发更新(最通用) 父控件把当前状态传给子控件,同时把“如何修改...
MVCC 通常指 Multi-Version Concurrency Control(多版本并发控制):在同一份数据上保留多个“版本”,让读操作与写操作尽量不互相阻塞,从而在高并发场景下兼顾吞吐与一致性。它把“并发控制”从硬碰硬的加锁对抗,转为基于版本与可见性规则的协调。 核心思路:同一行数据,不止...
CAS(Conditional Access System,条件接入系统)本质是“体系”,通常由软件为主、硬件为锚共同实现;落地形态取决于安全等级、成本、终端形态与监管要求。把它理解成一套把“内容加密、密钥分发、授权控制、反盗用追责”串起来的工程组合更准确,而不是单一的软件功能或某块硬件。 CAS ...
HashMap 的核心价值是用哈希表(hash table)把「键(key)」映射到「值(value)」,在均匀散列前提下把查找、插入、删除的平均成本压到常数级。但它并不“无脑好用”,真正容易踩坑的地方集中在:键的设计、容量与扩容、并发语义、遍历与顺序、允许的空值、以及内存与性能权衡。 键(Key)...
数据库索引的核心任务是“把一次查找从扫全表,变成走一条更短的路径”。Hash 索引把路径压缩成“算一个桶再直达”,B+ 树索引把路径组织成“按序走层级并可顺带扫一段”。两者差异几乎都来自一个关键点:是否保序(order-preserving)。 1)数据结构差异:直达 vs 有序导航 Hash 索引...