- 博客(334)
- 收藏
- 关注
原创 【Java从入门到精通】第24篇:原子变量与CAS的底层支撑——Unsafe类的内存操作与ABA问题的解决方案
锁通过阻塞线程解决并发冲突,原子变量则以无锁的CAS循环实现线程安全。本文从CPU指令级的cmpxchg出发,揭示CAS“比较并交换”的原子性根源,深入Unsafe类如何通过本地方法为JUC原子类提供内存操作的底层支撑,剖析AtomicInteger对CAS的封装与自旋重试机制,以及AtomicStampedReference如何通过版本号解决CAS固有的ABA问题。无锁编程不是锁的全面替代,而是特定高竞争场景下的性能优化利器。
2026-07-06 23:13:41
214
原创 【Java从入门到精通】第23篇:JUC并发工具库(下)——CountDownLatch、CyclicBarrier、Semaphore与线程池的生命周期
锁解决了多线程环境下的互斥问题,但当线程之间需要同步等待、协调推进或限流控制时,仅靠锁难以简洁表达。JUC提供了三组同步器工具:CountDownLatch以一次性门闩实现一组任务等待另一组任务完成,CyclicBarrier以可复用的栅栏让多个线程在同步点相互等待后齐步出发,Semaphore以许可模型控制同时访问资源的线程数量上限。线程池则封装了线程的复用、管理与调度策略,将线程从“创建-销毁”的短命模式升级为长期存活的工作者模式。本文系统拆解这些工具的设计原理与使用边界。
2026-07-06 23:12:25
215
原创 【Java从入门到精通】第22篇:JUC并发工具库(上)——Lock、Condition与读写锁的分离式并发
synchronized是Java内置的隐式锁,语法简洁但能力有限——无法中断等待、无法超时放弃、无法非阻塞尝试。JUC的Lock体系以显式锁补全了这些缺失。本文对比ReentrantLock与synchronized在公平锁、可中断获取、超时获取上的差异,剖析Condition如何将等待队列分离为多路条件实现精准唤醒,以及ReentrantReadWriteLock在读多写少场景下如何通过读写锁分离将并发吞吐量提升数倍。理解显式锁的控制能力与适用边界,是构建高性能并发组件的关键基础。
2026-07-03 11:16:16
180
原创 【Java从入门到精通】第21篇:线程安全的不可变基石——volatile的可见性保证与synchronized的锁升级路径
多线程环境下,共享变量的修改可能对其它线程不可见——这不是JVM的bug,而是Java内存模型为追求性能而赋予每条线程的缓存自由。本文从JMM的Happens-Before规则出发,论证volatile如何通过内存屏障保证写操作的即时可见性,同时揭示其不保证原子性的根本局限。深入synchronized在JDK 6之后的锁升级路径——偏向锁、轻量级锁、重量级锁如何在对象头Mark Word中逐级切换,以及锁消除与锁粗化等编译器优化如何让看似沉重的synchronized在多数场景下运行得比手工Lock更快。
2026-07-03 11:14:13
219
原创 【Java从入门到精通】第20篇:线程的生命周期模型——六种状态的转换图与Thread类的核心API
线程是Java并发编程的基本执行单元。本文以Java线程状态图为轴心,系统拆解NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED六种状态之间的转换触发条件与JVM底层实现机制,深入start()与run()的本质区别、sleep()与yield()在CPU调度上的行为差异、join()的等待语义与interrupt()的中断协作机制,以及废弃的stop()/suspend()/resume()为何被Java官方标记为不安全——理解线程生命周期的完整状态
2026-07-03 11:11:33
355
原创 【Java从入门到精通】第19篇:IO流的装饰器模式——字节流、字符流、缓冲流与对象序列化的管道设计
Java的IO类库以装饰器模式为核心设计理念,将不同类型的流通过层层包装组合出丰富的功能。本文从字节流与字符流的底层抽象出发,拆解FileInputStream到BufferedInputStream如何通过包装为流添加缓冲能力,InputStreamReader如何充当字节到字符的适配器桥梁,以及ObjectInputStream如何通过序列化与反序列化将对象图转化为可存储可传输的字节序列。理解IO流的装饰器架构,是掌握Java数据输入输出体系的关键。
2026-07-03 11:08:14
154
原创 【Java从入门到精通】第18篇:异常处理的设计哲学——受检异常、运行时异常与try-with-resources的自动关闭
异常机制将错误处理从业务逻辑中分离,让代码的正常路径与异常路径各司其职。本文从Error、受检异常与运行时异常三者的编译器态度差异出发,剖析受检异常在强制调用方处理错误与过度暴露实现细节之间的哲学争议,深入异常表的栈轨迹填充为何是异常最昂贵的性能开销,以及try-with-resources如何通过AutoCloseable接口将资源关闭从finally的繁琐样板代码中解放。理解异常的捕获边界与抛出粒度,是写出健壮且可维护代码的基本功。
2026-07-02 10:02:31
190
原创 【Java从入门到精通】第17篇:泛型的类型擦除真相——类型安全的编译期承诺与运行时的桥梁方法
泛型是Java类型系统在JDK 5迎来的最重大进化。它让集合框架从“可以装任何东西的黑箱”蜕变为“声明了能装什么东西的类型安全容器”。但Java泛型的实现选择了类型擦除——编译后泛型信息被移除,字节码中只剩原始类型和强制转换指令。本文揭示泛型擦除在字节码层面的完整链路,论证通配符与PECS法则在生产者-消费者场景的精确边界,剖析桥接方法如何自动生成以维持协变返回类型的多态正确性。理解泛型的编译期承诺与运行时真相之间的裂隙,是写出正确泛型代码的关键。
2026-07-02 09:59:16
228
原创 【Java从入门到精通】第16篇:Map家族的实现原理——HashMap的红黑树化、TreeMap的自然排序与LinkedHashMap的插入序
Map是Java集合框架中独立于Collection体系的键值对映射结构。本文深入HashMap的哈希扰动函数、扩容的rehash开销与链表树化的阈值逻辑,对比TreeMap基于红黑树的排序约束与范围查询优势,剖析LinkedHashMap通过双向链表维护插入序与访问序的LRU实现机制。理解这三种Map实现的底层数据结构差异,是在缓存设计、排序查询和数据索引场景中做出正确选型的前提。
2026-07-02 09:57:01
164
原创 【Java从入门到精通】第15篇:数组与集合框架的选择地图——List、Set、Queue各自的战场
数组是Java最基础的数据容器,但固定容量与单一操作语义使其在复杂场景中捉襟见肘。Java集合框架以统一的接口体系将数据结构与算法分离,为数据管理提供了完整的工具箱。本文构建数组与集合的选择地图,系统拆解List、Set、Queue三大接口的语义边界,深入ArrayList基于动态数组的随机访问优势与LinkedList基于双向链表的插入删除优势,并剖析两者在头部插入、中间删除等特定场景下的性能拐点——理解底层数据结构如何影响集合的操作复杂度。
2026-07-02 09:55:57
168
原创 【Java从入门到精通】第14篇:字符串的不可变性——String、StringBuilder、StringBuffer与字符串池的物理模型
String是Java中最常用的类,其不可变性设计深刻影响着程序的正确性与性能。本文从String内部final char[](JDK 9后改为byte[])的存储结构出发,论证不可变性如何保障字符串常量池的共享安全、HashSet中字符串键的哈希稳定性,以及多线程环境下字符串操作的免锁特性。深入字符串常量池的驻留机制与intern()方法的本地实现,对比StringBuilder与StringBuffer在单线程与多线程下的性能差异,并揭示JDK 9 Compact Strings优化如何通过byte[
2026-07-01 09:22:31
191
原创 【Java从入门到精通】第13篇:Object祖类的方法契约——equals、hashCode、toString与clone的覆写铁律
Java的每个类都隐式继承自Object,这意味着equals、hashCode、toString和clone这四个方法在所有类中都存在默认实现。然而,默认实现的语义往往与业务需求相悖——equals默认比较引用地址,hashCode默认将内存地址映射为整数,toString默认输出类名加哈希码的字符串。本文系统论证equals与hashCode的联合协定——相等的对象必须有相等的哈希码,违反此协定将导致HashSet和HashMap出现逻辑错误;剖析toString在日志调试中的诊断价值;并对比浅克隆与深
2026-07-01 09:21:39
204
原创 【Java从入门到精通】第12篇:枚举的高级语义——单例模式、策略枚举与EnumMap的源码解读
枚举常被初学者视为“一组命名常量”的简单语法糖,但其本质是继承自Enum类的final class。本文从字节码层面揭示枚举实例在静态初始化块中创建、由JVM类加载机制保证线程安全的底层原理,深入枚举在单例模式中抵御反射攻击的独特优势,展示策略枚举如何将if-else分支替换为多态方法分发,并剖析EnumMap为何能以数组性能碾压HashMap——它不是以枚举实例为键做哈希运算,而是利用枚举的ordinal序号直接映射为数组下标。
2026-07-01 09:20:49
163
原创 【Java从入门到精通】第11篇:内部类的四种形态——成员内部类、静态内部类、局部内部类与匿名内部类
内部类将类的定义放置在另一个类的内部,为Java的封装体系增加了一个精密的维度。本文系统拆解四种内部类的语法结构与适用场景:成员内部类对外部类的隐式引用机制,静态内部类的独立性与单例模式应用,局部内部类在方法作用域内的封装价值,以及匿名内部类在事件监听和回调接口中的经典用法。深入字节码层面揭示内部类为何生成独立的Class文件,以及外部类访问内部类私有成员的编译器桥接策略。
2026-07-01 09:19:50
216
原创 【Java从入门到精通】第10篇:抽象类与接口的博弈——模板方法模式与面向接口编程
抽象类与接口是Java实现抽象化的双轨机制。本文系统对比两者的技术边界——从JDK 8的默认方法到JDK 9的私有方法,接口的能力边界已被大幅拓展,而抽象类在构造器、状态持有和受控扩展上仍保有不可替代的优势。在此基础上,通过模板方法模式展示抽象类如何控制算法骨架、子类填充细节,通过策略模式展示接口如何实现行为的动态替换,帮助读者在两者之间做出精准的设计选择。
2026-06-30 06:12:42
282
原创 【Java从入门到精通】第9篇:继承的威力——extends、super与方法重写的多态根基
继承是面向对象编程中代码复用的核心机制,也是多态赖以建立的结构基础。本文从子类与父类的关系本质出发,系统拆解extends关键字的语法语义,深入super在子类构造器链式调用中的隐式行为,剖析@Override注解如何让编译器在编译期就拦截方法签名错误,并揭示向上转型后方法调用由实例实际类型决定的底层原理。继承不是目的,为多态服务才是其真正的架构价值。
2026-06-30 06:10:44
225
原创 【Java从入门到精通】第8篇:封装的艺术——private、getter/setter与JavaBean的约定
封装是面向对象编程的第一道防线。本文系统拆解Java访问权限修饰符的可见性矩阵——private、默认、protected、public在同类、同包、子类、跨包四种场景下的精确边界,深入getter/setter如何将数据访问从直接赋值转化为受控接口,以及JavaBean命名规范与内省机制如何将看似简单的get/set方法约定演化为支撑Spring等框架自动装配的底层基础设施。
2026-06-30 06:09:48
203
原创 【Java从入门到精通】第7篇:类与对象的关系本质——从现实世界到代码世界的抽象映射
类与对象是面向对象编程的基石。本文从现实世界的认知模式出发,阐述类作为“蓝图”与对象作为“实例”的哲学关系,拆解构造方法的链式调用机制,深入this关键字在区分成员变量与局部变量、调用同类构造器中的核心作用,并剖析对象在JVM内存中的存储模型——栈上的引用变量、堆上的实例数据、方法区中的类元信息,三者如何协同构成对象在程序中的完整生命形态。
2026-06-30 06:07:17
200
原创 【Java从入门到精通】第6篇:程序流程控制——分支结构、循环结构与跳转语句的控制流
程序从逐行顺序执行到根据条件选择路径,再到反复执行某段逻辑,依靠的是流程控制结构。本文系统拆解Java的三大控制流:if-else到switch-case的条件分支演进,for/while/do-while三种循环的适用场景对比,以及break/continue/return对控制流的精确干预。每种结构不仅讲解语法,更揭示其底层执行逻辑——为什么switch支持String而曾长期不支持,为什么循环嵌套中break需要标签——让读者真正理解控制流的设计意图。
2026-06-28 18:17:34
134
原创 【Java从入门到精通】第5篇:运算符与表达式——算术、关系、逻辑与位运算的优先级地图
运算符是程序对数据进行计算与判断的基本动词。本文系统拆解Java运算符的完整体系:算术运算符的数值提升与溢出陷阱,关系运算符的对象相等性判定,逻辑运算符的短路求值机制,以及位运算符在权限控制与硬件交互中的实战应用。构建运算符优先级的完整心智地图,帮助读者理解复杂表达式中隐式的计算顺序——不是靠背诵优先级表,而是靠理解运算符背后的语法设计逻辑。
2026-06-28 18:16:39
220
原创 【Java从入门到精通】第4篇:基本数据类型与变量——整数、浮点数、字符与布尔的内存形态
Java的数据类型分为基本类型与引用类型两大阵营,这是JVM内存模型最底层的设计决策。本文系统拆解8种基本数据类型的存储大小与取值范围,深入变量声明、初始化与作用域规则,剖析类型转换中隐式转换的安全边界与强制转换的精度丢失风险,以及final常量在编译期的常量折叠优化——这些看似枯燥的底层细节,正是写出安全高效Java代码的基石。
2026-06-28 18:13:10
175
原创 【Java从入门到精通】第3篇:Java程序的骨骼——类、main方法与包的命名规范
Java程序的最小单元是类,所有代码必须封装在类中。本文拆解类的声明结构,剖析main方法为何必须是public static void,解读String[] args的命令行参数传递机制,并阐明package声明与import导包如何将散乱的类组织为有序的命名空间。这些语法规则背后隐含着Java语言设计的深层哲学——强类型、强结构、强命名。
2026-06-28 18:11:50
179
原创 【Java从入门到精通】第2篇:开发环境搭建——JDK安装、IDE配置与第一个Hello World程序
上一篇文章追溯了Java从Oak到企业级生态的演进史,本文将这条历史线索落地为读者电脑上可运行的开发环境。从JDK与JRE的本质区别出发,手把手指导Windows/macOS下JDK的下载与安装,深入环境变量JAVA_HOME与Path的配置原理,对比IntelliJ IDEA与Eclipse的选型依据,最终创建第一个Java工程、编写Hello World程序,并逐行拆解main方法签名、编译命令javac与执行命令java在底层究竟发生了什么——让读者从第一天起就不仅会写代码,更理解代码为何这样写。
2026-06-27 19:31:14
149
原创 【Java从入门到精通】第1篇:Java语言的前世今生——从Oak到企业级生态的演进之路
Java的诞生并非灵光一现,而是1990年代嵌入式系统对跨平台语言迫切渴求的产物。从Oak的失败到Web浏览器的救赎,从JDK 1.0的简陋到JDK 21的庞杂生态,Java用近三十年时间构建了企业级开发的事实标准。本文追溯Java诞生前的技术困局、Write Once Run Anywhere理念的技术根基——字节码与JVM的架构耦合,以及从JDK 1.0到JDK 21的关键里程碑与LTS版本策略,帮助读者理解Java为何能穿越技术周期、至今仍稳居编程语言榜首。
2026-06-27 19:27:25
209
原创 【数据库系统原理】第40篇:数据库系统的永恒法则:对软硬件协同设计与自调优未来的展望
四十篇文章,从关系模型的数学基石到分布式共识协议,从B+树的节点分裂到ARIES的补偿日志,我们完成了一场穿越数据库系统六十年理论演进与工程实践的完整旅程。本文作为专栏的终章,回归数据库系统设计的本源命题——高效可靠地管理数据。从学习型索引对B+树的挑战到持久内存对WAL协议的改写,从云原生数据库对存算分离的极致推进到AI驱动的自调优系统对DBA角色的重塑,系统梳理新兴硬件与智能技术如何重新定义数据库系统的设计边界。在这些剧烈的技术变革中,识别那些不随硬件更迭而失效的永恒法则——那些从科德时代延续至今、在未
2026-06-27 19:20:07
207
原创 【数据库系统原理】第39篇:NewSQL与内存数据库:消除阻抗失配的技术革新
NoSQL以牺牲事务ACID语义换取了水平扩展能力,NewSQL则试图在分布式架构上完整实现ACID事务,证明一致性与扩展性并非互斥。本文系统阐述NewSQL的核心技术路径——从Spanner的全球时钟TrueTime到CockroachDB的分布式KV映射,揭示其如何在分布式环境下通过共识协议与两阶段锁重建可串行化隔离。同时深入内存数据库的设计范式——以内存为主存、磁盘为备份的架构如何颠覆传统缓冲池管理,反规范化的数据结构如何利用内存特性压缩存储与加速查询。NewSQL与内存数据库共同回应了同一个命题。
2026-06-27 19:12:25
320
原创 【数据库系统原理】第38篇:NoSQL数据库的兴起:键值、文档与列族——面向聚合模型的非关系设计
关系数据库统治数据管理三十年,却在互联网规模的非结构化数据、高并发读写与水平扩展需求面前暴露了架构性短板。NoSQL运动以聚合模型替代关系模型,将数据按访问边界预置为聚合单元,以牺牲即席查询灵活性换取水平扩展能力。本文系统阐述键值、文档、列族三类NoSQL系统的数据模型、查询范式与适用边界,剖析其与关系模型的根本分歧不在于SQL语法,而在于范式假设——从模式优先到模式随数据演化,从事务一致性到最终收敛的哲学转变。
2026-06-26 21:39:16
203
原创 【数据库系统原理】第37篇:CAP定理的历史重访与分布式共识:从ACID到BASE的范式转移
访问控制守护数据入口,却无法防御存储介质失窃或内部管理员越权。加密与审计构成安全体系的最后防线:传输层加密防范网络嗅探,存储层加密应对介质失窃,审计追踪为每次数据访问留下不可篡改记录。本文阐述三层加密体系与审计实现机制,揭示合规性要求如何将加密与审计从技术选项升格为法律强制义务。
2026-06-26 21:36:55
143
原创 【数据库系统原理】第36篇:数据加密与审计追踪:面向合规的安全防线
访问控制守护着数据的入口,但当存储介质被盗、备份磁带遗失、或内部管理员越权操作时,入口防线便形同虚设。数据加密与审计追踪构成了数据库安全体系的最后两道防线——加密确保即使数据落入敌手也无法被解读,审计追踪则确保任何对数据的访问都留下不可篡改的记录。本文系统阐述数据库加密的层次体系:传输层加密如何防范网络嗅探,存储层加密如何应对介质失窃,应用层加密如何在不可信数据库上保护数据私密性。同时深入审计追踪的技术实现——基于触发器的细粒度审计与基于日志的语句级审计,以及审计数据本身的安全防护。两道防线共同回应合规性
2026-06-26 21:35:05
280
原创 【数据库系统原理】第35篇:自主访问控制与强制访问控制:权限传递与安全标记
事务与恢复机制守护了数据库在并发与故障下的逻辑正确性,却无力应对另一类威胁——蓄意的越权访问。数据库安全机制以两道独立防线回应这一威胁:自主访问控制将权限管理权下放给数据属主,通过GRANT与REVOKE实现灵活的权限传递与回收;强制访问控制则以系统级的安全标记剥夺用户对权限的支配权,依贝尔-拉帕杜拉模型强制实施“下读上写”的信息单向流动法则。本文系统阐述两种访问控制范式的工作原理、权限传递的授权图模型、角色机制对授权管理的简化,以及两者在企业级数据库安全架构中的协同部署逻辑。
2026-06-26 21:32:01
303
原创 【数据库系统原理】第34篇:检查点与影子分页:缩短恢复时间的工程优化技术
ARIES框架解决了恢复的正确性问题——无论崩溃发生在何时,已提交的修改绝不丢失,未提交的修改绝不残留。但正确性并非恢复机制的全部追求。当数据库的日志文件积累了数小时甚至数天的连续写入,从头扫描日志的恢复时间将长到不可接受。检查点技术正是为截断这一恢复链条而生:在不阻塞正常事务处理的前提下,间歇性地在日志中锚定已知的系统状态,将恢复的起始点从日志源头跳跃到最近的检查点。与基于日志的恢复并行,影子分页技术以完全不同的路径实现事务原子性——事务的修改写入新页面,提交时仅需切换一个指针,旧版本瞬间变为新版本。
2026-06-26 21:28:13
343
原创 【数据库系统原理】第33篇:ARIES恢复算法:工业级数据库的经典恢复范式
ARIES是数据库恢复理论在工程实践中凝结出的最高成就。它并非单一算法,而是一套将WAL协议、Steal/No-Force策略、物理逻辑日志与补偿日志整合为有机整体的恢复体系。本文从三个维度深入解构ARIES的核心机制:分析阶段如何从检查点出发重建故障时刻的系统状态,Redo阶段如何忠实地重复历史而非选择性重做,Undo阶段如何通过补偿日志记录在反复崩溃中安全回滚。这三层机制环环相扣,共同实现了ARIES对崩溃恢复的根本承诺——在任意故障场景下,已提交事务的修改必不丢失,未提交事务的修改必不残留。
2026-06-26 21:26:38
236
原创 【数据库系统原理】第32篇:物理日志与逻辑日志:UNDO/REDO协议的WAL实现细节
上一篇建立了故障分类与恢复框架——事务故障、系统故障与介质故障的恢复边界,日志先行原则的理论基础,以及Undo与Redo的语义分工。本文在此基础上深入WAL的工程实现内核:物理日志记录字节级的前像与后像,以空间换简单;逻辑日志记录操作语义,以复杂度换灵活性。不同的日志类型与缓冲策略的组合,衍生出Undo/Redo、Undo/No-Redo与No-Undo/Redo三类WAL协议变体——它们在恢复效率、运行时开销和实现复杂度之间各有权衡。本文逐层拆解这些协议的工作机制与适用边界,为下一篇的ARIES算法铺设完
2026-06-25 14:09:00
148
原创 【数据库系统原理】第31篇:故障的分类与应对框架:事务、系统与介质故障的恢复边界
数据库运行在由硬件、软件、电力和人为操作构成的脆弱生态中,故障不是概率问题,而是时间问题。恢复机制是数据库系统对抗这一脆弱性的最后防线。本文将故障科学划分为事务故障、系统故障与介质故障三类,界定各自的破坏范围与恢复边界。在此基础上建立日志先行原则的理论基础——为什么日志记录必须在数据页之前落盘——并严格区分Undo与Redo两类恢复操作的应用场景:Undo抹去失败事务的痕迹以保证原子性,Redo重放已提交事务的修改以兑现持久性。这一Undo/Redo框架是理解下一篇文章中WAL协议与ARIES算法的概念基石
2026-06-25 14:07:19
206
原创 【数据库系统原理】第30篇:可串行化调度的理论验证:冲突与视图可串行化的判别
事务并发调度的正确性不能靠直觉判断,必须由严格的形式化标准来裁定。可串行化——并发调度的效果等同于某种串行执行——是隔离性的理论基石,但并非铁板一块。冲突可串行化以冲突操作的交换为核心,通过优先图无环性判定,是工业界的实际标准;视图可串行化则以读操作的来源为判据,以更宽松的约束容纳更多合法调度,却因NP完全的判定复杂度难以工程落地。本文构建并发调度的形式化分析框架——从操作序列表达到优先图构造算法,从冲突可串行化到视图可串行化的约束梯度,为前五篇文章的并发控制理论提供统一的数学收束。
2026-06-25 14:05:24
250
原创 【数据库系统原理】第29篇:多版本并发控制(MVCC):读写不冲突的快照隔离机制
锁机制以互斥保障正确性,代价是读写互相阻塞。多版本并发控制以一条截然不同的路径打破了这一僵局——写操作不覆盖原数据,而是创建新版本;读操作不等待写锁释放,而是读取事务开始时的历史快照。本文深入MVCC的技术内核:元组版本链的物理结构、基于事务ID的快照可见性判断、以及快照隔离如何实现“读不阻塞写、写不阻塞读”的并发承诺。同时揭示快照隔离的结构性缺陷——写偏差异常——这种无法通过锁机制防范、也无法由快照隔离检测的一致性违规,正是理解可串行化与快照隔离之间理论鸿沟的关键。
2026-06-25 14:03:52
205
原创 【数据库系统原理】第28篇:多粒度封锁与意向锁:锁定层级的效率优化
行级锁赋予高并发度,但当事务需要扫描整张表时,逐行加锁的开销将吞噬所有性能收益。多粒度封锁机制允许事务根据操作范围选择最优锁粒度——从行到页到表——但不同粒度锁的共存引发了新的冲突判定难题。意向锁正是为解决这一难题而设计:在粗粒度节点上标记“内部有细粒度锁”的意图,使系统无需遍历整个子树即可判定锁冲突。本文系统阐述多粒度锁的层次结构、IS、IX、SIX等意向锁的兼容矩阵,以及锁升级机制如何在实际系统中动态平衡并发度与管理开销。
2026-06-25 14:02:22
236
原创 【数据库系统原理】第27篇:基于锁的并发控制:两阶段锁协议(2PL)及其死锁博弈
锁是并发控制最质朴的手段——事务在访问数据前必须获取相应锁,冲突的事务被阻塞等待。但仅凭随意加锁并不足以保证可串行化。两阶段锁协议以一条简洁的规则——事务获取锁的阶段与释放锁的阶段不得重叠——从理论上保证了并发调度可串行化。本文从锁的基本类型与粒度出发,严密论证2PL的可串行化保证机制,对比严格2PL在防范级联回滚中的关键作用,并深入死锁这一锁机制无法回避的博弈困局——从死锁预防的策略权衡到死锁检测的等待图算法,再到现实数据库系统如何在这两套方案之间做出工程选择。
2026-06-25 14:00:54
174
原创 【数据库系统原理】第26篇:并发操作的异常现象:丢失更新、脏读与不可重复读的实证分析
事务隔离性的承诺是让并发事务彼此透明,但在不加控制的并发交织中,这一承诺会被系统性打破。本文构建精确的并发时序场景,实证分析四种典型并发异常——丢失更新、脏读、不可重复读与幻读——的发生机制与时序条件。丢失更新源于写-写冲突的覆盖,脏读源于读取未提交的中间状态,不可重复读与幻读则暴露了读-写冲突下重复读取的不一致。通过严格界定每种异常的触发前提与破坏后果,本文导出隔离级别分级管控的必要性——不同的隔离级别以不同程度的并发限制为代价,逐级关闭异常发生的窗口。
2026-06-24 15:47:17
195
原创 【数据库系统原理】第25篇:事务的哲学:ACID属性——原子性、一致性、隔离性与持久性
数据库系统运行在充满故障与并发的真实世界——硬件随时可能断电,多个用户可能同时修改同一行数据。事务机制正是为对抗这种不确定性而设计的核心抽象。本文将事务定义为不可分割的工作单元,系统解析ACID四属性的内涵:原子性以“全有或全无”的语义抵御中途失败,一致性以完整性约束守卫数据逻辑,隔离性以并发控制消解竞争干扰,持久性以日志和写入策略对抗存储失效。同时揭示这组看似自洽的属性在系统故障与并发操作下面临的深刻张力,为后续事务管理系列奠定概念基石。
2026-06-24 15:44:47
291
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅