MST

星途 面试题库

面试题:PostgreSQL中常见导致死锁的场景及如何避免

请列举至少两种在PostgreSQL数据库中常见的可能导致死锁的场景,并阐述针对每种场景,你所知道的避免死锁的方法。
33.1万 热度难度
数据库PostgreSQL

知识考点

AI 面试

面试题答案

一键面试

场景一:并发事务按不同顺序访问相同资源

  • 场景描述:假设有两个事务 T1T2T1 先获取资源 A 的锁,接着尝试获取资源 B 的锁;而 T2 先获取资源 B 的锁,然后尝试获取资源 A 的锁。如果在获取第二个锁时,两个事务都在等待对方释放锁,就会形成死锁。
  • 避免方法
    • 按固定顺序访问资源:所有事务都按照相同的顺序访问资源。例如,无论是哪个事务,都先获取资源 A 的锁,再获取资源 B 的锁,这样就不会出现循环等待的情况。
    • 使用超时机制:为每个事务设置一个获取锁的超时时间。如果在规定时间内未能获取到锁,事务自动回滚。这样即使出现死锁趋势,也能在一定时间后打破死锁。

场景二:锁升级

  • 场景描述:在一个事务中,对大量数据进行操作,开始时使用行级锁,随着操作的数据量增加,数据库可能会将行级锁升级为表级锁。如果此时有其他事务正在对该表的其他行进行操作并持有行级锁,就可能导致死锁。
  • 避免方法
    • 优化事务逻辑:尽量减少单个事务中对大量数据的操作,将大事务拆分成多个小事务。这样可以降低锁升级的概率,减少死锁的可能性。
    • 合理设置锁模式:根据业务需求,明确指定合适的锁模式,避免数据库自动进行锁升级。例如,明确使用行级锁,即使数据量较大也不进行锁升级。