首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么MVCC需要对DML语句进行锁定

为什么MVCC需要对DML语句进行锁定
EN

Stack Overflow用户
提问于 2015-05-30 12:30:00
回答 1查看 863关注 0票数 7

在PostgreSQL中,MVCC并发控制机制指出:

为查询(读取)数据而获得的MVCC锁与为写入数据而获得的锁不冲突,因此读取从不阻止写入和写入从不阻止读取。

因此,已承诺,一个UPDATE语句将锁定当前受影响的行,以便其他事务无法修改它们,直到当前事务提交或回滚为止。

如果并发事务对锁定的行发出更新,则第二个事务将阻塞,直到第一个事务释放其锁为止。

  1. 这种行为试图防止写-写冲突吗?
  2. 在READ_COMMITTED中仍然可以发生丢失的更新,因为在第一个事务提交之后,第二个事务将覆盖行(即使数据库在更新查询开始和查询结束之间发生了更改)。那么,如果丢失更新仍然是可能的,为什么第二个事务要等待呢?行级快照不能用来存储未提交的事务更改,以避免事务不得不等待写锁的释放吗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-30 13:59:23

第一个问题的答案是肯定的。任何DBMS都不能支持脏写;如果两个事务T1和T2同时执行,并且T2覆盖了来自T1的更新,那么系统就无法处理T1随后发出回滚的情况,因为T2的更新已经发生。

为了避免脏写,快照隔离的最初定义是“第一个提交者胜利”--即允许发生冲突写入,但只有发出提交的第一个事务才能--所有其他冲突的事务都必须回滚。但是这个编程模型有些问题,如果不是浪费的话,因为一个事务可能更新数据库的很大一部分,最终却被拒绝提交。因此,大多数支持MVCC的DBMS系统使用相当传统的两阶段锁定来实现“第一次更新者赢”,而不是“第一个提交者获胜”。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30546187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档