在PostgreSQL中,MVCC并发控制机制指出:
为查询(读取)数据而获得的MVCC锁与为写入数据而获得的锁不冲突,因此读取从不阻止写入和写入从不阻止读取。
因此,已承诺,一个UPDATE语句将锁定当前受影响的行,以便其他事务无法修改它们,直到当前事务提交或回滚为止。
如果并发事务对锁定的行发出更新,则第二个事务将阻塞,直到第一个事务释放其锁为止。
发布于 2015-05-30 13:59:23
第一个问题的答案是肯定的。任何DBMS都不能支持脏写;如果两个事务T1和T2同时执行,并且T2覆盖了来自T1的更新,那么系统就无法处理T1随后发出回滚的情况,因为T2的更新已经发生。
为了避免脏写,快照隔离的最初定义是“第一个提交者胜利”--即允许发生冲突写入,但只有发出提交的第一个事务才能--所有其他冲突的事务都必须回滚。但是这个编程模型有些问题,如果不是浪费的话,因为一个事务可能更新数据库的很大一部分,最终却被拒绝提交。因此,大多数支持MVCC的DBMS系统使用相当传统的两阶段锁定来实现“第一次更新者赢”,而不是“第一个提交者获胜”。
https://stackoverflow.com/questions/30546187
复制相似问题