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 |
|
|
Confirma a transação atual |
A instrução é executada com sucesso |
|
|
Reverte a transação atual |
A instrução falha |
|
|
Marca a instrução como falha se as linhas afetadas não forem iguais a |
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_SUCCESSconfirma a transação imediatamente quando a instrução tem êxito.ROLLBACK_ON_FAILreverte 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 peloROLLBACK_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 |
Apenas PolarDB for MySQL 8.0 |
Não é possível executar |
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