面试题答案
一键面试在PostgreSQL数据库中,两阶段锁通常应用于以下场景:
- 事务中的并发读写操作:当多个事务同时对数据库进行读写操作时,为避免数据不一致,需要使用两阶段锁。例如,假设有两个事务T1和T2,T1读取并更新用户表中某个用户的余额,T2同时也尝试读取和更新同一用户余额。
- 若不使用锁,可能出现T1读取余额后,T2也读取相同余额,然后T1更新了余额,T2基于旧余额更新,导致数据错误。
- 使用两阶段锁时,T1先获取用户余额行的排它锁,读取并更新后,在事务提交阶段释放锁。T2在T1持有锁期间无法获取锁,只能等待,从而保证数据一致性。
- 复杂事务中的多表操作:涉及多个表关联的复杂事务。比如一个订单处理事务,需要同时更新订单表、库存表等。
- 事务开始,先获取订单表相关行的锁,再获取库存表相关行的锁,确保在事务执行过程中,其他事务不能干扰这些表数据的一致性。例如在创建新订单时,减少库存表中对应商品的库存数量。在整个事务提交前,这些锁一直持有,防止其他事务对订单和库存数据的错误修改。
- 数据一致性要求高的场景:如银行转账操作,从一个账户向另一个账户转账。
- 首先获取转出账户和转入账户对应的行锁,读取账户余额进行计算,然后更新两个账户余额。在事务未提交前,一直持有锁,防止其他事务在转账过程中读取或修改账户余额,确保转账操作的原子性和数据一致性。若转账事务失败,会回滚并释放锁,保证数据回到初始状态。