面试题答案
一键面试写偏斜产生的原因
- 并发事务操作:在串行化隔离级别下,理论上事务应串行执行,但数据库系统为了提高并发性能,会采用一些优化手段。当多个事务并发执行时,若事务之间存在特定的数据依赖关系,就可能导致写偏斜。
- 缺乏足够的锁机制:传统的锁机制如果没有全面覆盖所有可能的依赖关系,就会出现漏洞。例如,事务只对自己直接操作的数据加锁,而未对相关联但未直接操作的数据加锁,当其他事务修改这些关联数据时,就可能引发写偏斜。
写偏斜产生的场景
假设银行账户系统中有两个账户A和B,总金额需要保持一定的平衡。
- 事务T1:读取账户A的余额,根据业务逻辑进行一些计算,准备更新账户A的余额,但还未提交。
- 事务T2:同时读取账户B的余额,同样进行一些计算,准备更新账户B的余额,也未提交。
- 并发执行:由于两个事务没有直接对对方操作的数据加锁,当T1更新A余额,T2更新B余额后,可能导致总金额平衡被打破,这就是写偏斜的场景。
PostgreSQL检测策略
- SIREAD(Serializable Snapshot Isolation Read):PostgreSQL使用SIREAD来检测写偏斜。在事务开始时,会记录一个快照,该快照包含事务开始时所有已提交的数据版本。在事务执行过程中,每次读取数据时,不仅会检查数据版本,还会检查是否存在可能导致写偏斜的并发事务。
- 冲突检测:当事务准备提交时,PostgreSQL会检查事务执行期间读取的数据是否被其他并发事务修改。如果发现冲突,就判定可能存在写偏斜。
PostgreSQL解决策略
- 回滚:一旦检测到写偏斜,PostgreSQL会回滚其中一个事务。通常会选择回滚最晚开始的事务,以最小化对系统并发性能的影响。
- 重试:被回滚的事务可以由应用程序重新发起,重新执行整个事务逻辑,从而保证数据的一致性。
对系统性能的影响
- 开销增加:检测机制需要额外的存储空间来记录快照,并且每次读取和提交操作都需要进行冲突检测,这增加了CPU和I/O开销。
- 并发度降低:由于可能会回滚事务,并发事务的执行效率会受到影响,特别是在高并发场景下,事务回滚的概率增加,导致整体性能下降。
对系统可用性的影响
- 稳定性提升:通过检测和解决写偏斜,保证了数据的一致性,使得系统在数据层面更加稳定可靠。
- 短暂不可用:事务回滚和重试过程中,可能会导致部分业务操作短暂不可用,尤其是对于对实时性要求较高的业务,可能会有一定影响,但从长远来看,保证了系统整体的可用性和数据正确性。