【Descrição do Problema】 Quando os usuários usam o APP, a página fica muito travada, e eles clicam aleatoriamente, porque a interface não faz envios repetidos, haverá várias solicitações idênticas; na camada de serviço, uma thread não insere complet, e a outra thread verifica, vazia. Então também coloquei um. Originalmente, todos tinham um, mas um vendedor tinha três, resultando em erros de lógica de negócios. Para o processamento de submissões maliciosas, isso pode ser feito na parte front-end, e também podem existir soluções maduras na parte back-end.
【Solução】1. Use restrições de unicidade para resolver o problema de idempotência das transações, defina restrições de unicidade e, se houver um cenário de commits repetidos, exceções às restrições de unicidade serão lançadas no nível do banco de dados, e a lógica de negócio não será destruída. Restrições de unicidade na composição de múltiplos campos também são aceitáveis.
O login do hiperlink está visível.
O que foi dito acima é para criar configurações anti-duplicação no nível do banco de dados.
2. Realizar configurações anti-duplicação no nível do código. Muitas vezes, diz-se que a restrição de unicidade do banco de dados afetará a eficiência da inserção de dados, pois cada inserção requer um julgamento no nível do banco de dados. Portanto, julgando pelo nível do código, a prática comum no nível do código é selecionar primeiro e depois inserir, mas se houver um cenário de alta concorrência, ainda haverá commits repetidos. Você pode adicionar sincronizado ao código lógico, de modo que, em cenários de alta concorrência, selecione primeiro e depois inserir efeito. Mas a eficiência não é alta, e o paralelo torna-se seriado. O mecanismo de travamento DCL pode ser utilizado. (Você já percebeu que o método de criar um único objeto no modo de cópia do caso é muito semelhante, primeiro julgue se o objeto existe, se não existe, crie-o, caso contrário não o crie), o mecanismo natural de bloqueio DCL é mais eficiente.
#分布式锁 Fechaduras distribuídas também podem ser usadas para resolver o problema, comumente usadas por Redis e Zookeeper. Esta seção explica como implementar bloqueios distribuídos usando Redis. Existe uma operação de comando setNx no Redis, se ela não existir, é um valor fixo, e 1 é retornado. Se existir, não se define e retorna 0. Utilizando o recurso de single-threading do Redis, a cena de alta concorrência é convertida em uma série através da fila de mensagens. No entanto, existem armadilhas nas fechaduras distribuídas, então você precisa prestar atenção.
O login do hiperlink está visível. 3. Mecanismo MVCC?
3.1 O que é o mecanismo MVCC? MVCC é um mecanismo de controle de concorrência com múltiplas versões.
3.2 Quais problemas podem ser resolvidos? O mecanismo de travamento pode controlar operações simultâneas, mas sua sobrecarga do sistema é grande, e o MVCC pode substituir travas em nível de fileira na maioria dos casos, o que pode reduzir a sobrecarga do sistema e melhorar o desempenho.
O login do hiperlink está visível.
4. Há também um problema de idempotência nas mensagens
Por exemplo, como evitar o consumo repetido de mensagens?
No middleware de mensagens no MQ, esses devem ser compreendidos e compreendidos.
|