Salut tout le monde,
Sur une base j'ai plusieurs sessions bloquées à cause d'un Update qui a créé un wait de type "Row Lock Contention".
Ce que je comprends c'est que la session 1 fait un Update sur la ligne 100 de ma table ET oublie de faire un Commit ou Rollback donc le lock perdure et bloque les autres sessions.
Là où je me dis qu'il y a un pb c'est que si les autres sessions sont bloquées par ce lock c'est qu'elles veulent modifier la même ligne, ce qui me semble bizarre : un user bosse sur un dossier, pas sur celui de son voisin.
Mais bon, passons, ma question n'est pas là.
Ma question est : si une autre session voulait faire un Update sur la ligne 101 et que celle-ci se trouve dans le même bloc de données que la ligne 100, cette session doit attendre à cause du wait Buffer busy wait, OK? En effet la première session a pris un latch sur la Cache Buffer Chain dont un des Buffer Headers pointe vers le bloc. Et tant que la session 1 n'a pas terminé son job, le bloc reste inaccessible en modification à toute autre session.
Donc en résumé :
- session 1 fait un update ligne 100, session 2 fait un update ligne 101 dans un autre bloc appartenant à une autre CBC (Cache Buffer Chain) : aucun problème, pas de "Buffer Busy Wait", un lock posé ligne 100 et ligne 101, un latche posé sur chaque CBC .
- session 1 fait un update ligne 100, session 2 fait un update ligne 101 dans un autre bloc appartenant à la même CBC : problème, wait "cache buffer chain", un lock posé ligne 100, un latche posé sur la CBC.
- session 1 fait un update ligne 100, session 2 fait un update ligne 101 dans le même bloc (donc appartenant à la même CBC) : problème, "Buffer Busy Wait", la session 2 attend et un lock est posé par la session 1 sur la ligne 100.
C'est bien ça?
Partager