面试题答案
一键面试常见冲突类型
- 更新冲突:多个事务尝试同时更新同一行数据。例如,事务A和事务B都要修改用户表中某个用户的余额字段。
- 插入冲突:在唯一约束(如唯一索引)存在的情况下,多个事务试图插入相同的唯一值。比如,多个事务都尝试插入具有相同用户名的用户记录,而用户名设置了唯一约束。
- 删除冲突:当一个事务尝试删除某行数据,而另一个事务正在对该行进行更新操作时可能发生冲突。
检测方式
- MVCC(多版本并发控制):PostgreSQL基于MVCC机制来管理并发事务。每个事务在启动时会获得一个快照,该快照包含了当时数据库中所有已提交事务的状态。在读取数据时,事务根据快照判断哪些数据版本是可见的,从而避免读操作与写操作之间的冲突。在写操作时,PostgreSQL会为新的数据版本生成一个新的事务ID,并记录旧版本数据的事务ID。通过比较事务ID,检测是否存在并发修改冲突。
- 锁机制:
- 行级锁:对于更新、删除操作,PostgreSQL会获取行级排他锁(X锁)。如果另一个事务已经持有该行的X锁,新的事务会被阻塞,直到锁被释放,以此检测更新冲突和删除冲突。
- 表级锁:在某些特殊情况下,如批量插入且涉及唯一约束检查时,会获取表级锁。表级共享锁(S锁)允许并发读取,排他锁(X锁)则阻止其他事务对表进行读写操作,通过这种方式检测插入冲突等。同时,PostgreSQL还会使用意向锁来协调行级锁和表级锁之间的关系,避免死锁并提高并发性能。