2010-03-26 6 views
1

Je souhaite synchroniser l'accès à un insert particulier. Par conséquent, si plusieurs applications exécutent cette insertion "un", les insertions doivent se produire une à la fois. La raison derrière la synchronisation est qu'il devrait y avoir seulement une instance de cette entité. Si plusieurs applications tentent d'insérer la même entité, une seule doit réussir et d'autres échouer. Une option envisagée consistait à créer une clé unique composite, qui identifierait l'entité de manière unique et s'appuierait sur une contrainte unique. Pour certaines raisons, le département dba a rejeté cette idée. Une autre option qui m'est venue à l'esprit était de créer un proc stocké pour l'insert et si le proc stocké peut obtenir un verrou global, alors plusieurs applications invoquant le même proc stocké, bien que dans leurs sessions séparées, on s'attend à ce que le proc stocké peut obtenir un verrou global et donc sérialiser les inserts. Ma question est-il possible pour un proc stocké dans Oracle version 10/11, pour obtenir un tel verrou et tout pointeur vers la documentation serait utile.Verrouillage global Oracle sur le processus

+0

Je ne peux pas imaginer pourquoi le groupe DBA a dit "n'utilisez pas une contrainte unique pour sérialiser l'accès à un groupe de colonnes" considérant que c'est l'une des principales raisons d'avoir une contrainte unique. La seule raison que je peux éventuellement proposer est que si la session A insère une ligne qui bloque les sessions B, C et D, les sessions B-D se bloqueront en attendant que la session A commette ou annule l'instruction de blocage. Vous pouvez également affirmer que vous avez besoin de l'index unique pour la cohérence des données, et qu'ils n'auront aucune jambe sur laquelle s'appuyer. –

Répondre

1

Si vous voulez que les entités insérées soient uniques, vous n'avez pas besoin de sérialiser quoi que ce soit dans Oracle - une contrainte unique est parfaitement conçue et adaptée à cet effet. Oracle gère tout le verrouillage requis pour s'assurer qu'une seule entité est insérée.

Je ne peux pas penser à une raison pour laquelle le département dba a rejeté l'idée d'une contrainte unique, c'est assez basique - peut-être qu'ils ont rejeté un autre aspect de votre solution proposée. Si vous voulez sérialiser l'accès pour une raison quelconque (et je ne vois pas pourquoi vous le feriez), vous pourriez (a) obtenir un verrou sur toute la table, ce qui sérialiserait tous les DML sur la table; ou (b) obtenir un verrou nommé par l'utilisateur en utilisant DBMS_LOCK - qui ne ferait que sérialiser le ou les processus particuliers dans lesquels vous obtenez le verrou. Les deux options ont des avantages et des inconvénients.

Questions connexes