web-dev-qa-db-fra.com

Verrouiller dans SQL Server et Oracle

J'ai fait quelques tests de verrouillage/blocage dans MSSQL Server et Oracle, j'ai remarqué une différence:

Dans Oracle - j'ai effectué une mise à jour pour une ligne sans émettre de validation ni de restauration et dans une autre session, je peux afficher l'enregistrement sous-jacent, bien sûr, je pouvais afficher les dernières données validées et non la valeur qui devait encore être validée.

Dans MSSQL Server - Lorsque j'ai fait la même opération dans une autre session, SQL Server a continué d'attendre la validation ou la restauration de la ligne qui est mise à jour.

Quelqu'un pourrait-il expliquer le mécanisme de verrouillage entre le serveur MSSQL et Oracle.

10
Danilo Neto

Il s'agit d'un comportement par défaut de SQL Server, pour mieux comprendre, vous devez appeler le niveau d'isolement. Ce que vous avez décrit ci-dessus correspond au niveau d'isolement appelé "Read Committed". Si vous voulez un comportement similaire comme Oracle dans SQL Server, vous devez activer l'option de base de données Read Committed Snapshot, cette option prend un instantané de vos données avant les modifications et les place dans tempdb, en conséquence, vous verrez le dernier enregistrement validé qui était un instantané des derniers enregistrements validés. Un autre niveau d'isolement Read Uncommitted retournera dans cette situation des données mais avec un gros problème, c'est-à-dire que vous lirez des enregistrements non validés et il y a de fortes chances que vous puissiez lire un enregistrement sale.

Il existe un concept de nolock et readpast comme indice de verrouillage dans SQL Server pour éviter le verrouillage, mais il a son propre impact.

Vous pouvez en savoir plus sur le niveau d'isolement sur le site de Microsoft à ce lien .

Il y a des tonnes d'articles sur ce sujet de nombreuses PME, j'en énumère quelques-unes pour votre référence:

  1. Brent Ozar -> https://www.brentozar.com/archive/2013/01/implementing-snapshot-or-read-committed-snapshot-isolation-in-sql-server-a-guide/

  2. Kendra Little -> https://littlekendra.com/2016/02/18/how-to-choose-rcsi-snapshot-isolation-levels/

  3. Erik Darling -> https://www.brentozar.com/archive/2018/01/heaps-deletes-optimistic-isolation-levels/

  4. Paul White -> https://sqlperformance.com/2014/07/t-sql-queries/isolation-levels

  5. Robert Sheldon -> https://www.red-gate.com/simple-talk/sql/t-sql-programming/questions-about-t-sql-transaction-isolation-levels-you-were -trop timide à demander /

Il y a une vidéo de Brent Ozar (impossible à trouver maintenant) où il a clairement expliqué la différence entre Oracle et SQL Server que vous avez mentionnée. Pour cette raison, Oracle coûtait beaucoup plus tôt que SQL Server par cœur, mais maintenant le cas/scénario est différent. Une dernière chose à ajouter ici - Dans Azure, RCSI est le comportement par défaut.

J'espère que l'aide ci-dessus. En fait, c'est moins une question qu'un sujet très important et la compréhension de SQL Server et difficile de les couvrir en une seule réponse, mais les liens ci-dessus vous guideront certainement dans la bonne direction.

9
Learning_DBAdmin