Je fais un système de facturation, avec le support de plusieurs filiales qui ont chacune leur propre numéro de facture, donc j'ai un tableau avec une clé primaire de (Filiale, InvoiceNoAlternative à Max (ID) dans la clé primaire complexe
Je ne peux pas utiliser le champ d'incrémentation automatique MySQL, car il incrémentera constamment le même nombre pour toutes les filiales.
Je ne veux pas faire des tables séparées pour chaque filiale car il y aura de nouveaux ajoutés comme besoin filiales ou être ...
J'utilise actuellement « Sélectionner Max (ID) Où Filiale = X », de ma table et en ajoutant la facture en fonction de cela.
J'utilise nHibernate, et l'insertion de facture, précède l'insertion InvoiceItem, donc si l'insertion de facture échoue, InvoiceItem ne sera pas exécuté. Mais à la place, je vais attraper l'exception, re-récupérer le Max (ID) et essayer à nouveau.
Quel est le problème avec cette approche? Et le cas échéant, quelle est une alternative?
Le Reson pour demander est parce que je lis une des réponses sur cette question: Nhibernate Criteria: 'select max(id)'
Cela ressemble exactement à quelque chose que je cherche, Pourriez-vous éclaircir le processus de verrouillage un peu plus. Aurais-je besoin de sélectionner * à partir des factures où filiale = x pour la mise à jour, puis une autre requête sur la même session pour obtenir l'identifiant max? –
Vous auriez besoin d'une table «subventionnée» où vous avez une rangée par subvention. Ce serait cette rangée que vous verrouilleriez, pour montrer qu'une opération exclusive était en cours pour la subvention. 'START TRANSACTION', puis' SELECT id FROM SUBWATER SUBWELL_ID =? FOR UPDATE', alors 'SELECT MAX (id) FROM facture ...', 'INSERT ...', 'COMMIT'. –
Ainsi, lorsque vous verrouillez la ligne subsidiaire dans la table subsidiaire, elle ne permet pas d'insérer de nouveaux enregistrements ayant cette ligne comme contrainte de clé étrangère? Est-ce exact? –