ACID模型中保证多数据读取者无法查看未提交数据的属性确认及示例咨询
嘿,咱们把这个ACID相关的问题掰扯清楚哈!
ACID属性疑问解答:一致性 vs 隔离性
首先直接给你结论:你的判断不正确,这道题的正确答案是A. Isolation(隔离性),下面咱们一步步拆解原因,再给你举实际例子。
先明确ACID四个核心属性的职责边界
- Atomicity(原子性):保证事务是一个不可分割的执行单元——要么所有操作全成功,要么全失败。比如转账时,扣付款人余额和加收款人余额必须同时生效或同时回滚,不会出现半完成的状态。
- Consistency(一致性):聚焦于数据本身的业务规则正确性,保证事务执行前后,数据库始终符合预设的约束(比如总金额不变、年龄字段为正整数等)。它和“是否能看到未提交数据”完全不相关。
- Isolation(隔离性):这才是负责控制多事务间可见性的属性,它能阻止一个事务读取另一个事务未提交的修改(也就是避免“脏读”问题),让多个事务看起来像是在独立执行。
- Durability(持久性):一旦事务提交,它的修改就永久保存在数据库中,哪怕后续系统崩溃也不会丢失。
为什么你会混淆两个属性?
你把“数据可见性控制”错误归给了一致性,但一致性的核心是维护数据的业务逻辑合法,而隔离性才管多事务之间的相互干扰。阻止用户查看未提交数据,属于典型的事务间可见性控制,是隔离性的职责范围。
实际场景示例
隔离性阻止脏读的例子
假设数据库里有一张accounts表,Alice的初始余额是1000元:
- 事务1启动:执行
UPDATE accounts SET balance = balance - 500 WHERE name = 'Alice'(余额变为500),但未提交。 - 如果没有隔离性(比如用最低的READ UNCOMMITTED隔离级别),事务2执行
SELECT balance FROM accounts WHERE name = 'Alice'时,会读到500元这个未提交的修改(脏读)。 - 若事务1随后回滚,Alice余额变回1000元,但事务2已经拿到了错误的500元,业务逻辑就会出问题。
- 当开启READ COMMITTED及以上隔离级别(隔离性生效),事务2会读到事务1启动前的1000元,看不到未提交的修改,避免了脏读。
一致性的典型例子(和隔离性无关)
还是用转账场景:Alice转500元给Bob,事务包含两个操作:扣Alice500元、加Bob500元。
- 不管事务成功提交还是中途失败回滚,一致性都会保证Alice和Bob的总余额始终是2000元(假设两人初始各1000),不会出现总余额变成1500或2500的非法状态。
内容的提问来源于stack exchange,提问作者Surender Raja
相关产品推荐
相关产品推荐

