Question

Pour mon application, un particulier d'écriture doit être fait en vrac et sans la possibilité d'un autre interférents.

J'ai été dit que les deux concurrents les opérations dans cette voie mènera à la première bloquant la seconde, et la seconde peut ou peut ne pas se terminer après la première.

Veuillez envoyer la documentation qui confirme ce.Aussi, exactement ce qui se passe à la deuxième opération, si le premier est le blocage?Il sera mis en file d'attente, ne parviennent pas, ou une combinaison des deux?

Si cela ne peut être confirmé, si le niveau d'isolation de transaction pour cette transaction être mis à SERIALIZABLE?Si oui, comment peut-on le faire avec libpqxx déclarations préparées à l'avance?

Si les transactions sont en série, le deuxième transaction échouer ou d'être mis en file d'attente jusqu'à ce que le premier a terminé?

Si pas, comment cela peut-il être détecté avec libpqxx?

Était-ce utile?

La solution

La seule façon de façon concluante prévenir les effets secondaires de la concurrence est de LOCK TABLE ... IN ACCESS EXCLUSIVE MODE chaque table que vous souhaitez modifier.

Cela signifie que vous êtes vraiment le faire seulement une chose à la fois.Elle conduit également à l'amusement des problèmes de blocages si vous n'avez pas toujours acquérir vos serrures dans le même ordre.

Donc en général, ce que vous devez faire est de comprendre ce qu'est exactement les opérations que vous souhaitez ne sont, et comment ils interagissent.Déterminer ce que la simultanéité des effets que vous pouvez tolérer, et comment empêcher que ceux qui vous ne pouvez pas.

Cette question, comme il se est tout simplement trop vaste pour répondre utilement.

Les Options incluent:

  • Exclusivement de verrouillage des tables.(C'est le seul moyen pour faire un multi-ligne upsert sans les problèmes de simultanéité dans PostgreSQL pour le moment).Méfiez-vous de verrouiller la mise à niveau et de verrouillage d'ordre liées à des blocages.

  • utilisation appropriée de SERIALIZABLE isolation - mais rappelez-vous, vous devez être en mesure de garder une trace de ce que vous avez fait au cours d'une transaction et de réessayer si le tx abandonne.

  • Attention au niveau de la ligne de verrouillage - SELECT ... FOR UPDATE, SELECT ... FOR SHARE.

  • "Le verrouillage optimiste" / contrôle d'accès concurrentiel optimiste, le cas échéant

  • L'écriture de vos requêtes de manière à les rendre les plus bienveillants envers fonctionnement parallèle.Par exemple, le remplacement de lecture-modification-écriture avec des cycles en place des mises à jour.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top