O orçamento é apenas uma tabuada do tipo 2 x 1 = 2, qualquer um pode pegar o celular, abrir o aplicativo calculadora, e executa a operação.
A dor de cabeça começa quando você quer gravar essa operação num banco de dados.
Imagina dois usuários: Frank e Yudi.
Frank, 2 x 1 = 2
Yudi, 2 x 1 = 2
Qual o melhor meio de registrar essas tabuadas? Eu vou criar uma tabela para cada usuário ou coloco tudo numa só tabela?
A minha intuição diz que eu devo usar apenas uma tabela, assim:
tbtabuada
id
usuário
quantidade
preço
A chave do problema é o id da tbtabuada. Imagina que o Frank e o Yudi abrem o celular ao mesmo tempo na opção nova tabuada, os dois recebem o mesmo id, vamos supor o 1. O Frank salva a tabuada primeiro com o id=1, e dois minutos depois o Yudi salva a tabuada dele. Ou seja, a tabuada do Frank vai desaparecer.
Para contornar esse desastre, a ideia é a tabela fornecer o id depois que as informações forem fornecidas. Mas o que acontece se os dois salvarem as informações ao mesmo tempo?
[Gemini]
To effectively manage multi-user budgeting and address the concurrency issue you've described, consider implementing the following approach:
**1. Utilize Unique Transaction IDs and Optimistic Locking:**
- Employ a unique transaction ID (e.g., UUID) for each budget operation to ensure data integrity.
- Implement optimistic locking, a concurrency control mechanism, to prevent conflicts when multiple users attempt to modify the same data simultaneously.
**2. Database Schema with Transaction IDs:**
- Modify your database schema to include a `transaction_id` column alongside the existing `id`, `usuario`, `quantidade`, and `preço` columns in the `tbtabuada` table.
**3. Generate Unique Transaction IDs:**
- Generate a unique transaction ID for each new budget operation. This can be done using a UUID generator or a similar mechanism.
**4. Insert with Optimistic Locking:**
- When a user saves a budget operation, attempt to insert a new record into the `tbtabuada` table with the generated transaction ID, user information, quantity, and price.
- Use an `INSERT ... SELECT` statement to perform the insertion while checking for a conflicting record based on the `usuario`, `quantidade`, and `preço` values.
**5. Conflict Resolution and Retry:**
- If an insert attempt fails due to a conflict (i.e., another user has already saved a record with the same `usuario`, `quantidade`, and `preço`), inform the user of the conflict and prompt them to retry the operation.
- Upon a retry, generate a new unique transaction ID and repeat the insert attempt with the updated transaction ID.
**6. Successful Insert and Response:**
- If the insert is successful, the new record with the generated transaction ID will be added to the `tbtabuada` table.
- Provide a success message to the user indicating that their budget operation has been saved.
**7. Handling Concurrent Requests:**
- In the scenario where both Frank and Yudi attempt to save their budget operations simultaneously, one of the inserts will succeed, and the other will fail due to the conflict.
- The user associated with the failed insert will be notified of the conflict and prompted to retry, while the user associated with the successful insert will receive a confirmation message.
- Upon retrying, the user's insert attempt will generate a new unique transaction ID, increasing the likelihood of success in the subsequent attempt.
By implementing this approach, you can effectively manage multi-user budgeting, prevent data conflicts, and ensure that each user's budget operation is accurately recorded in the database.
Pergunta
Frank K Hosaka
Link para o comentário
Compartilhar em outros sites
1 resposta a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.