-1
votes

Sélectionnez et insérez au même moment SQL 2016

J'ai une table simple dans mon application où est

id | Valeur | Date | ItemID

Tout le temps, certains éléments inséraient des données a jeté mon site Web sur cette table. Je n'ate que des données de 5 minutes ou plus. En même temps, lorsque j'utilise mon application Web, je sélectionne des valeurs max, min et actuelles pour les éléments. De temps en temps, j'ai

transaction (ID de processus 62) était impassible aux ressources de serrure avec un autre processus et a été choisi comme victime d'impasse. Revenir à transaction.

Y a-t-il une chance d'obtenir des données et pour ce moment où je sélectionne, ne vous souciez pas des inserts?


1 commentaires

Utilisez-vous SQL Server?


3 Réponses :


2
votes

Vous pouvez utiliser avec (nolock) indice, Cela vous obtiendra des données non engagées.

Voir la réponse ici Qu'est-ce que "avec (nolock)" dans SQL Server?

et ici http://sqlserverplanet.com/tsql/using-with-nolock


2 commentaires

Si cela, je vais apprécier si vous le ferez comme la réponse sélectionnée :)


Jusqu'à présent, le client n'a envoyé aucune demande que le problème est toujours existant :)



0
votes

Vous pouvez modifier la requête SELECT pour éviter les blocages comme:

Sélectionnez l'élémentId, max (valeur), min (valeur) de Table_Name avec (Nolock) Group by ItemID, date


0 commentaires

1
votes

Si vous utilisez SQL Server 2016 :

problème: Lorsque nous écrivons un SELECT Signal (code> Les verrous partagés sont conservés sur des ressources disent que la TableX à partir de laquelle les valeurs max, min et actuelles sont sélectionnées. Maintenant, pour ce moment, si vous INSERTER DATA dans ces tables verrouillées (TABLEX), alors car Insérer nécessite un Verrouillage exclusif Serrure sur la ressource (TABLEX) , l'instruction insert attendra le Sélectionnez pour être terminé.

solution: Comme suggéré dans les messages ci-dessous, nous pouvons utiliser avec (nolock) ou avec (lecture non engagée) indice de table de sorte que Sélectionnez Les instructions ne portent pas de verrouillage sur les ressources sous-jacentes (TABLEX ). Mais le problème est que ce SELECT peut lire des données non engagées modifiées pendant une transaction puis a été renvoyée à son état initial (également appelé lecture de données sale).

Si vous voulez vous assurer que le SELECT lit les données engagées et ne bloquez pas non plus le inserts pour écrire à tableX, puis au niveau de la base de données SET READ_COMMITTED_SNAPSHOT Sur .


0 commentaires