REJAVA / LEARNING NOTES
第11课速查:事务边界与隔离级别
随时回查术语、规则和示例;完整解释见对应课程。
根据课程材料整理
本次更新说明
- 整理为公开学习笔记,保留要点、对照表与练习入口。
审批操作的一条主线
同一连接开始 transaction(事务)→核对业务条件→更新状态+新增记录→全部成功才提交;任一步失败,停止成功流程,请求回滚并报告错误。
autocommit(自动提交)默认开启,不显式分组时,两条普通数据修改分别提交。COMMIT(提交语句)与 ROLLBACK(回滚语句)只控制当前事务;已提交结果不能再靠回滚撤销。
ACID(事务四项属性)
| 属性 | 记住什么 |
|---|---|
| atomicity(原子性) | 成组提交或撤销;不等于任意报错自动回滚整组 |
| consistency(一致性) | 满足约束与业务规则,正确逻辑仍由应用负责 |
| isolation(隔离性) | 并发读写的可见性与干扰按级别约束 |
| durability(持久性) | 成功提交的保存能力,要结合可靠性设置和硬件 |
三种现象与两种常用级别
dirty read(脏读):读到别人未提交的修改。non-repeatable read(不可重复读):同一事务重复读同一行,别人提交使值改变。phantom read(幻读):重复同样条件,符合条件的记录集合变化。
| 级别 | 普通一致性读 |
|---|---|
| READ UNCOMMITTED(读未提交) | 可能脏读,不按本课已提交快照规则判断 |
| READ COMMITTED(读已提交) | 每次读新快照 |
| REPEATABLE READ(可重复读) | 同事务复用首次一致性读的快照;本事务自己的写入可见 |
| SERIALIZABLE(可串行化) | 更强隔离;关闭自动提交时普通查询转为共享锁定读 |
读数例子: A先普通查询得到0,B改为1并提交,A同事务再次普通查询。A不写、不加锁时,读已提交得到1,可重复读仍为0。如果A开始事务后尚未首次读,B已提交,A第一次读在两种级别下都能看到1。
容易背错的四句话
| 错误说法 | 改成这样 |
|---|---|
| 插入报错,整个事务肯定都撤销 | 普通重复键错误只撤销该语句;业务失败明确走回滚分支 |
| 开始事务时就固定了快照 | 普通开始语句不等于首次一致性读;显式开始时建快照是另一用法 |
| 可重复读里所有操作都读旧值 | 普通一致性读、锁定读、写操作要分开,自己的写入还可见 |
| 看见待审批,就没人能抢先处理 | 普通读不锁住审批权;需要并发控制并在保护下检查状态 |
MVCC(多版本并发控制)利用旧版本信息支持一致性读取;SELECT … FOR UPDATE(查询并加更新锁)读取最新可用记录并加锁,冲突时可能等。锁在事务结束时释放,不要让事务等待用户确认。
完整表达的顺序
业务要成组修改什么 → 同连接的开始、提交与失败回滚 → 两次读取的时间顺序 → 隔离级别与快照 → 普通读和锁定读的边界。真实项目事实、拟定方案、课程里的教学推演分开说。
隔日复测见课程末尾;可选的数据库实验不是学习新课的前提。