Processamento simultâneo de pedidos - bloqueio pessimista e otimista, fila de tarefas

Por que usar bloqueios

Junte-se a A e B e faça um pedido para comprar a mercadoria A. A quantidade de estoque antes do pedido é 15; ao fazer um pedido, A faz um pedido mais rápido e compra 10 peças. Quando B faz um pedido, ele ainda é julgado pelo inventário 15, para que ocorram erros de dados.

Ao criar um pedido, supondo que alguém e você operem simultaneamente na quantidade de mercadorias, para garantir que os dados estejam seguros, você pode usar o bloqueio otimista. Ao atualizar a quantidade de mercadorias, é necessário avaliar se não é a quantidade anterior.

Soluções

1. Bloqueio pessimista

Ao consultar um determinado registro, deixe o banco de dados bloquear o registro.Depois do bloqueio, outras pessoas não podem manipular os dados.Se outras transações quiserem obter o bloqueio, deverão aguardar o término da transação original.

selecione estoque de tb_sku onde id = 1 para atualização; 
SKU.objects. select_for_update () .get (id = 1)         # 悲观 锁

2. Bloqueio otimista

O bloqueio otimista não é um bloqueio real, mas avalia se o inventário no momento é o inventário consultado anteriormente quando é atualizado.Se são os mesmos, significa que os dados não foram modificados e o inventário pode ser atualizado, caso contrário, o inventário não é atualizado

atualizar tb_sku definir estoque = 2, em que id = 1 e estoque = 7 ;     
SKU.objects.filter (id = 1, estoque = 7 ) .update (stock = 2) #    Julgar antes de atualizar

3. Fila de tarefas

Coloque a lógica de colocar pedidos na fila de tarefas (como aipo), converta paralelo em serial e todos os filas para fazer pedidos. Por exemplo, inicie o Aipo com apenas um processo e processe a ordem por ordem. 
Agora, resolvemos o problema dos bloqueios e todas as solicitações são processadas usando uma fila "primeiro a entrar, primeiro a sair". Está chegando um novo problema: no cenário de alta simultaneidade, porque há muitas solicitações, é provável que a memória da fila seja "explodida" em um instante e, em seguida, o sistema cairá novamente em um estado anormal. 
Ou projetar uma enorme fila de memória também é uma solução.No entanto, a velocidade com que o sistema pode processar solicitações em uma fila não pode ser comparada com o número de execuções na fila.
Ou seja, quanto mais solicitações na fila se acumularem, mais o tempo médio de resposta do sistema da Web cairá bastante e o sistema continuará sendo uma exceção.

Se o bloqueio pessimista ou otimista deve ser escolhido

Quando os conflitos são baixos, use o bloqueio otimista. Quando houver muitos conflitos, use bloqueios pessimistas.O bloqueio 
e o desbloqueio de bloqueios pessimistas requerem recursos da CPU, portanto, usar bloqueios otimistas é uma escolha melhor quando há menos pedidos.

Nota: Ao usar o bloqueio otimista, você precisa alterar o nível de isolamento da transação do banco de dados MySQL para uma leitura não repetível

O nível de isolamento de transações do banco de dados MySQL é de leitura repetível, portanto, a leitura dos dados é consistente. Altere para leitura não repetível, outras transações são enviadas e precisam ser capazes de detectar a modificação dos dados, para que o bloqueio otimista funcione

 

Acho que você gosta

Origin www.cnblogs.com/wangcuican/p/12735165.html
Recomendado
Clasificación