Tous les produits
Search
Centre de documentation

PolarDB:Limites des index secondaires globaux sur les opérations DML

Dernière mise à jour :Aug 11, 2026

Dans PolarDB-X 1.0, l'échec d'une écriture sur un index secondaire global (GSI) bloque toute la table : aucune instruction DML ne peut s'y exécuter et la transaction active ne peut pas être validée. La compréhension de ce comportement permet d'éviter les échecs de transaction inattendus et de concevoir des modèles d'écriture sûrs pour les GSI.

Prérequis

Avant de commencer, vérifiez que vous disposez des éléments suivants :

  • Instances ApsaraDB RDS for MySQL en version 5.7 ou ultérieure

  • Instances PolarDB-X 1.0 en version 5.4.1 ou ultérieure

Table d'exemple

Les exemples de cette rubrique utilisent la table suivante. Elle définit un GSI standard (g_i_seller) et un GSI unique (g_i_buyer) :

CREATE TABLE t_order(
  `id` bigint(11) NOT NULL AUTO_INCREMENT,
  `order_id` varchar(20) DEFAULT NULL,
  `buyer_id` varchar(20) DEFAULT NULL,
  `seller_id` varchar(20) DEFAULT NULL,
  `order_snapshot` longtext DEFAULT NULL,
  `order_detail` longtext DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `l_i_order` (`order_id`),
  GLOBAL INDEX `g_i_seller` (`seller_id`) dbpartition by hash(`seller_id`) tbpartition by hash(`seller_id`),
  GLOBAL UNIQUE INDEX `g_i_buyer` (`buyer_id`) COVERING (order_snapshot) dbpartition by hash(`buyer_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 dbpartition by hash(`order_id`);

Comportement des opérations DML lors d'un échec d'écriture GSI

Important

L'échec d'une écriture GSI place la table dans un état bloqué. Tant que ce blocage persiste, aucune instruction DML ne peut s'exécuter sur la table et la transaction ne peut pas être validée.

L'exemple suivant illustre ce comportement :

SET DRDS_TRANSACTION_POLICY='XA';

-- Succeeds: inserts order_1 with buyer_id='buyer_1'.
-- The unique GSI g_i_buyer records buyer_id='buyer_1'.
INSERT INTO t_order(order_id, buyer_id, seller_id) VALUES('order_1', 'buyer_1', 'seller_1');

-- A GSI failed to be written to the table.
INSERT IGNORE INTO t_order(order_id, buyer_id, seller_id) VALUES('order_2', 'buyer_1', 'seller_1');

-- Blocked: no DML can execute on t_order while the GSI write failure persists.
INSERT IGNORE INTO t_order(order_id, buyer_id, seller_id) VALUES('order_2', 'buyer_2', 'seller_2');

-- Blocked: the transaction cannot be committed.
COMMIT;