聊聊数据库中的 savepoint

💡 原文中文,约2800字,阅读约需7分钟。
📝

内容提要

构建全局二级索引时,开启分布式事务并并行插入数据以保证一致性。使用savepoint回滚插入失败的数据,而不是整个事务。PolarDB-X通过设置auto-savepoint实现回滚单条逻辑SQL的功能。通过减少设置savepoint的次数和使用私有协议来减轻代价。

🎯

关键要点

  • 构建全局二级索引时,需要开启分布式事务以保证主表和索引表数据的一致性。

  • 插入失败时,可以使用savepoint回滚单条数据,而不是整个事务。

  • PolarDB-X通过设置auto-savepoint实现回滚单条逻辑SQL的功能。

  • savepoint在事务中用于记录特定状态,以便后续回滚。

  • MySQL通过维护savepoint链表来实现savepoint功能。

  • 在PolarDB-X中,物理连接执行前设置savepoint,执行后根据情况回滚或释放。

  • 设置和释放savepoint的代价较低,但应尽量减少设置次数。

  • 只有在涉及GSI或逻辑执行的DML时,才自动设置savepoint以保证原子性。

  • 通过多语句方式下发savepoint SQL和业务物理SQL,避免增加额外的RTT。

  • 使用私有协议绕过savepoint SQL的解析过程,直接在DN上调用设置和释放savepoint的代码。

➡️

继续阅读