Todos os produtos
Search
Central de documentação

PolarDB:Inventory hint

Última atualização: Jun 28, 2026

Os inventory hints permitem incorporar a lógica de controle de transação diretamente nas instruções SQL para confirmar ou reverter uma transação conforme o resultado da instrução. Em cenários de escrita com alta concorrência, como vendas relâmpago e dedução de estoque, várias transações competem para atualizar a mesma linha simultaneamente, causando contenção de bloqueios que reduz o throughput. Os inventory hints resolvem cada escrita concorrente em uma única ida e volta, eliminando a necessidade de lógica de nova tentativa no nível da aplicação. Utilize-os em conjunto com o recurso de statement queue para serializar escritas conflitantes em buckets e maximizar o throughput.

Versões compatíveis

Os inventory hints estão disponíveis nas seguintes versões do PolarDB for MySQL:

Versão

Versão secundária mínima do kernel

PolarDB for MySQL 8.0

8.0.1.1.1

PolarDB for MySQL 5.7

5.7.1.0.17

PolarDB for MySQL 5.6

Todas as versões secundárias

Para verificar a versão secundária do kernel do seu cluster, consulte Query the engine version.

Como funciona

Os inventory hints são compatíveis com instruções SELECT, UPDATE, INSERT e DELETE. Três hints estão disponíveis:

Hint

Efeito

Acionado quando

COMMIT_ON_SUCCESS

Confirma a transação atual

A instrução é executada com sucesso

ROLLBACK_ON_FAIL

Reverte a transação atual

A instrução falha

TARGET_AFFECT_ROW(n)

Marca a instrução como falha se as linhas afetadas não forem iguais a n

Durante a execução da instrução

Esses hints funcionam em conjunto para conduzir tanto a operação DML quanto o resultado da transação em uma única instrução:

  • COMMIT_ON_SUCCESS confirma a transação imediatamente quando a instrução tem êxito.

  • ROLLBACK_ON_FAIL reverte a transação imediatamente quando a instrução falha.

  • TARGET_AFFECT_ROW(n) converte uma divergência na contagem de linhas — por exemplo, ao atualizar um item esgotado — em uma falha de instrução, capturada posteriormente pelo ROLLBACK_ON_FAIL.

A combinação dos três hints com a statement queue serializa escritas conflitantes em buckets e resolve cada transação em uma única ida e volta.

Sintaxe

A sintaxe varia entre o PolarDB for MySQL 5.6 e o PolarDB for MySQL 5.7/8.0.

COMMIT_ON_SUCCESS

Confirma a transação quando a instrução tem êxito.

PolarDB for MySQL 5.6

UPDATE COMMIT_ON_SUCCESS t
SET c = c - 1
WHERE id = 1;

PolarDB for MySQL 5.7 e 8.0

UPDATE /*+ COMMIT_ON_SUCCESS */ t
SET c = c - 1
WHERE id = 1;

ROLLBACK_ON_FAIL

Reverte a transação quando a instrução falha.

PolarDB for MySQL 5.6

UPDATE ROLLBACK_ON_FAIL t
SET c = c - 1
WHERE id = 1;

PolarDB for MySQL 5.7 e 8.0

UPDATE /*+ ROLLBACK_ON_FAIL */ t
SET c = c - 1
WHERE id = 1;

TARGET_AFFECT_ROW

Marca a instrução como falha se o número de linhas afetadas não corresponder ao valor especificado. Definir o valor como 1 significa que a instrução terá êxito se pelo menos um registro for atualizado. Caso nenhuma linha corresponda à cláusula WHERE, a instrução falhará e retornará um erro.

PolarDB for MySQL 5.6

UPDATE TARGET_AFFECT_ROW 1 t
SET c = c - 1
WHERE id = 1;
-- ERROR HY000: The affected row number does not match that of user specified.

PolarDB for MySQL 5.7 e 8.0

UPDATE /*+ TARGET_AFFECT_ROW(1) */ t
SET c = c - 1
WHERE id = 1;
-- ERROR HY000: The affected row number does not match that of user specified.

Uso com statement queue

Combine COMMIT_ON_SUCCESS, ROLLBACK_ON_FAIL e TARGET_AFFECT_ROW com a statement queue para enfileirar escritas conflitantes no mesmo bucket e resolver cada transação em uma única passagem.

PolarDB for MySQL 5.6: utiliza POLARDB_STATEMENT_CONCURRENT_QUEUE com uma expressão de chave ou valor literal.

UPDATE COMMIT_ON_SUCCESS POLARDB_STATEMENT_CONCURRENT_QUEUE id ROLLBACK_ON_FAIL TARGET_AFFECT_ROW 1 t
SET col1 = col1 + 1
WHERE id = 1;
-- Query OK, 1 row affected (0.00 sec)
-- Rows matched: 1  Changed: 1  Warnings: 0

UPDATE COMMIT_ON_SUCCESS POLARDB_STATEMENT_CONCURRENT_QUEUE 1 ROLLBACK_ON_FAIL TARGET_AFFECT_ROW 1 t
SET col1 = col1 + 1
WHERE id = 1;
-- Query OK, 1 row affected (0.00 sec)
-- Rows matched: 1  Changed: 1  Warnings: 0

PolarDB for MySQL 5.7 e 8.0: utiliza CCL_QUEUE_VALUE dentro do bloco de hint /*+ ... */.

UPDATE /*+ COMMIT_ON_SUCCESS ROLLBACK_ON_FAIL TARGET_AFFECT_ROW(1) CCL_QUEUE_VALUE('id') */ t
SET col1 = col1 + 1
WHERE id = 1;
-- Query OK, 1 row affected (0.00 sec)
-- Rows matched: 1  Changed: 1  Warnings: 0

UPDATE /*+ COMMIT_ON_SUCCESS ROLLBACK_ON_FAIL TARGET_AFFECT_ROW(1) CCL_QUEUE_VALUE(1) */ t
SET col1 = col1 + 1
WHERE id = 1;
-- Query OK, 1 row affected (0.00 sec)
-- Rows matched: 1  Changed: 1  Warnings: 0

Restrições

Restrição

Escopo

Detalhes

Modo autocommit

Apenas PolarDB for MySQL 8.0

Não é possível executar COMMIT_ON_SUCCESS e ROLLBACK_ON_FAIL quando o autocommit está ativado. Desative o autocommit antes de usar esses hints ou envolva a instrução em uma transação explícita.

A execução de COMMIT_ON_SUCCESS ou ROLLBACK_ON_FAIL no modo autocommit retorna o seguinte erro:

UPDATE /*+ ROLLBACK_ON_FAIL */ t
SET c = c - 1
WHERE id = 1;
-- ERROR 7531 (HY000): Inventory transactinal hints didn't allowed in autocommit mode