À l'aide de for update nowait va provoquer les lignes à être occupé et acquiert un verrou jusqu'à ce qu'un commit ou rollback est exécutée.
Toute autre session qui tente d'acquérir un verrou obtenir un Oracle message d'erreur comme ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired instead of waiting the lock to release.
Session1:
CURSOR abc_cur
ISselect*from dept where deptno =10forupdate nowait;
Ici, les lignes sont verrouillés jusqu'à ce que le curseur est fermé ou un commit/rollback est exécuté. Si, pendant ce temps, un autre utilisateur de la session 2 tente d'accéder à la même dossiers puis cela provoquera une erreur, comme indiqué ci-dessous:
Session2:
select*from dept where deptno =10forupdate nowait;
Cet utilisateur ne peut même pas mettre à jour ou supprimer les enregistrements qui ont été bloqués par la première session.
ERROR at line 1:`ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired`
Utilisation:
Maintenant, si vous voulez faire des manipulations sur certains ensembles de dossiers et vous ne voulez pas d'un autre utilisateur à partir d'une autre session pour remplacer vos données, alors vous devez d'abord verrouiller les enregistrements(à l'aide de for update nowait) et ensuite faire votre manipulation. Après vous avez terminé avec votre manipulation, fermer le curseur et valider.
MODIFIER
Supposons qu'il y a 10 lignes en temp et j'exécute le script suivant dans ma session 1 :
Puis-je obtenir ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired instead of waiting the lock to release.
Donc, si je n'utilise pas attendre je ne peux même pas récupérer(sélection) de la même ligne à partir d'une autre session, ai-je le droit? Si je veux récupérer mais pas de mise à jour de la même ligne à partir d'une autre session, comment dois-je réagir? vous pouvez sélectionner les mêmes lignes de l'autre session , mais vous cannout verrouiller les mêmes lignes ,si c'est l'été verrouillé par une autre session .Oui, vous pouvez récupérer les lignes d'une autre session . Mon doute, c'est que, dans le cas que j'ai demandé "aucune attente" ne peut pas être utilisé, coz quand je n'utilise pas attendre ", sélectionnez" coutume de travail à partir d'une autre session?? régulièrement sélectionnez serait de travailler dans une autre session. la règle est que les écrivains ne bloquez jamais les lecteurs. ainsi, un simple "sélection à partir de la table" va fonctionner que si toutes les autres sessions lignes verrouillé ou non. c'est juste que d'autres sessions ne seront pas en mesure d'effectuer DML sur les lignes verrouillées jusqu'à ce que la session de blocage est validée ou annulée.
À l'aide de
for update nowait
va provoquer les lignes à être occupé et acquiert un verrou jusqu'à ce qu'un commit ou rollback est exécutée.Toute autre session qui tente d'acquérir un verrou obtenir un Oracle message d'erreur comme
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired instead of waiting the lock to release
.Session1:
Ici, les lignes sont verrouillés jusqu'à ce que le curseur est fermé ou un commit/rollback est exécuté. Si, pendant ce temps, un autre utilisateur de la session 2 tente d'accéder à la même dossiers puis cela provoquera une erreur, comme indiqué ci-dessous:
Session2:
Cet utilisateur ne peut même pas mettre à jour ou supprimer les enregistrements qui ont été bloqués par la première session.
Utilisation:
Maintenant, si vous voulez faire des manipulations sur certains ensembles de dossiers et vous ne voulez pas d'un autre utilisateur à partir d'une autre session pour remplacer vos données, alors vous devez d'abord verrouiller les enregistrements(à l'aide de
for update nowait
) et ensuite faire votre manipulation. Après vous avez terminé avec votre manipulation, fermer le curseur et valider.MODIFIER
Supposons qu'il y a 10 lignes en temp et j'exécute le script suivant dans ma session 1 :
Dans la session 2, je exécutez les opérations suivantes pendant que le script dans la session 1 est toujours en cours d'exécution
Si j'exécute le même script, dans la session 2, tandis que le script dans la session 1 est toujours en cours d'exécution
Puis-je obtenir
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired instead of waiting the lock to release.
Si je veux récupérer mais pas de mise à jour de la même ligne à partir d'une autre session, comment dois-je réagir?
vous pouvez sélectionner les mêmes lignes de l'autre session , mais vous cannout verrouiller les mêmes lignes ,si c'est l'été verrouillé par une autre session .Oui, vous pouvez récupérer les lignes d'une autre session .
Mon doute, c'est que, dans le cas que j'ai demandé "aucune attente" ne peut pas être utilisé, coz quand je n'utilise pas attendre ", sélectionnez" coutume de travail à partir d'une autre session??
régulièrement sélectionnez serait de travailler dans une autre session. la règle est que les écrivains ne bloquez jamais les lecteurs. ainsi, un simple "sélection à partir de la table" va fonctionner que si toutes les autres sessions lignes verrouillé ou non. c'est juste que d'autres sessions ne seront pas en mesure d'effectuer DML sur les lignes verrouillées jusqu'à ce que la session de blocage est validée ou annulée.
OriginalL'auteur Gaurav Soni