Vla*_*cea 6 postgresql locking transactions mvcc dml
在PostgreSQL中,MVCC并发控制机制说:
为查询(读取)数据而获取的MVCC锁与写入数据时获取的锁不冲突,因此读取永远不会阻止写入和写入从不阻止读取
因此,即使对于READ_COMMITTED,UPDATE语句也会锁定当前受影响的行,因此在当前事务提交或回滚之前,没有其他事务可以修改它们.
如果并发事务在锁定的行上发出UPDATE,则第二个事务将阻塞,直到第一个事务释放它的锁.
这种行为是否试图阻止写 - 写冲突?
丢失的更新仍然可以在READ_COMMITTED中发生,因为在第一个事务提交之后,第二个将覆盖该行(即使数据库在UPDATE查询开始和查询结束之间已经更改).因此,如果仍然可以丢失更新,为什么第二笔交易必须等待?是否可以使用行级快照来存储未提交的事务更改,以避免事务必须等待释放写锁?
小智 5
第一个问题的答案是肯定的。没有 DBMS 可以支持脏写;如果两个事务 T1 和 T2 同时执行,并且 T2 覆盖了 T1 的更新,则系统无法处理 T1 随后发出 ROLLBACK 的情况,因为 T2 的更新已经发生。
为了避免脏写,快照隔离的原始定义是“第一个提交者获胜”——也就是说,允许发生冲突的写操作,但只有第一个发出 COMMIT 的事务才能这样做——所有其他冲突的事务都必须这样做回滚。但这种编程模型即使不是浪费,也有些问题,因为事务可能会更新数据库的很大一部分,但最终却无法提交 COMMIT。因此,大多数支持 MVCC 的 DBMS 系统使用相当传统的两阶段锁定来实现“第一个更新者获胜”,而不是“第一个提交者获胜”。
| 归档时间: |
|
| 查看次数: |
584 次 |
| 最近记录: |