OVH Cloud OVH Cloud

update et insert : timeout expired

20 réponses
Avatar
Cactus Corp.
Bonjour!

Depuis peu, la grande majorité des mises à jours ou insertions de données
sur mon site web finissent 'presque' toutes en une exception 'Timeout expired'.
Cela fait plusieurs jours que je tente de trouver la source du problème, mais
en vain, j'en viens donc à demander de l'aide sur les groupes...


Il s'agit d'une appliction AspNet,

Les timeouts ont été placés à 15 secondes,

Dans tous les cas, il s'agit de mettre à jour 1 entrée ou d'ajouter 1 entrée
dans une des deux tables.

Chaque table contient respectivement 1500 et 4500 entrées.

Shémas:
tbl_commentaires (id, ip, auteur, corps, dateheure)
tbl_news (id, ip, refmembre, corps, dateheure, vues)

Requêtes :

1) INSERT INTO tbl_commentaires VALUES (blababla , ....
2) UPDATE tbl_news SET vues = (vues + 1) WHERE ID = x

Il n'y a pas d'indexes créé , excepté l'index de clé primaire.

Erreur détaillée:
"Timeout expired. The timeout period elapsed prior to completion of
the operation or the server is not responding."

Et une question pour finir : si je passe les timeout à 45 secondes, souvent
cela fini par passer. Mais........pour quelle raison cela pourrait-il être si
long ??!!?

Si quelqu'un a des idées à me proposer ou si un supplément d'informations
est nécessaire, je suis preneur !!!

Antonio

10 réponses

1 2
Avatar
Fred BROUARD
les time out sont les conséquences en général de problèmes de contention, qui
peuvent venir, par exemple d'un grand nombre de clients à servir ou de verrous
bloquant...

Si vos requêtes 1 et 2 sont combinées et participent à un même traitement vous
devriez mettre tout ceci dans une procédure stockée si possible transactionnées.
Cela éviterait les aller et retours réseaux générateurs de gaspillage de temps,
donc de contention.

Du genre :

CREATE PROCEDURE P_IU_COMMENT_NEWS @VAR1 ...
AS

BEGIN TRANSACTION

INSERT INTO tbl_commentaires
VALUES (blababla , ....

IF @@ERROR <>
GOTO LBL_ROLL

UPDATE tbl_news
SET vues = vues + 1
WHERE ID = x

IF @@ERROR <>
GOTO LBL_ROLL

COMMIT TRANSACTION
RETURN

LBL_ROLL:
ROLLBACK TRANSACTION


De manière très générale il vaut mieux procéder avec des procédures qu'avec des
requêtes pour tout ce qui est mis à jour de données au moins (INSERT, UPDATE,
DELETE).


A +

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************



Cactus Corp. a écrit:
Bonjour!

Depuis peu, la grande majorité des mises à jours ou insertions de données
sur mon site web finissent 'presque' toutes en une exception 'Timeout expired'.
Cela fait plusieurs jours que je tente de trouver la source du problème, mais
en vain, j'en viens donc à demander de l'aide sur les groupes...


Il s'agit d'une appliction AspNet,

Les timeouts ont été placés à 15 secondes,

Dans tous les cas, il s'agit de mettre à jour 1 entrée ou d'ajouter 1 entrée
dans une des deux tables.

Chaque table contient respectivement 1500 et 4500 entrées.

Shémas:
tbl_commentaires (id, ip, auteur, corps, dateheure)
tbl_news (id, ip, refmembre, corps, dateheure, vues)

Requêtes :

1) INSERT INTO tbl_commentaires VALUES (blababla , ....
2) UPDATE tbl_news SET vues = (vues + 1) WHERE ID = x

Il n'y a pas d'indexes créé , excepté l'index de clé primaire.

Erreur détaillée:
"Timeout expired. The timeout period elapsed prior to completion of
the operation or the server is not responding."

Et une question pour finir : si je passe les timeout à 45 secondes, souvent
cela fini par passer. Mais........pour quelle raison cela pourrait-il être si
long ??!!?

Si quelqu'un a des idées à me proposer ou si un supplément d'informations
est nécessaire, je suis preneur !!!

Antonio




Avatar
Cactus Corp.
Bonjour Fred,

Votre proposition d'utiliser des procédures stockées me demanderait
de changer toute la conception de l'application et de la coupler au sgbd,
non ?

Ce qui m'ennuie un peu en faisant cela, c'est que jevais simplement
contourner le problème sans l'avoir réellement identifié. Pourtant, je veux
vraiment savoir ce qui ne joue pas.

Je crois qu'il me manque des connaissances théoriques sur ce point et
je ne sais pas précisemment où les trouver. J'étais convaincu qu'un SELECT
pouvait se faire totalement indépendamment des autres opérations en
cours dans la base. Je pensais aussi qu'un UPDATE concernant une seule
table, une seule ligne, ne pouvait pas (en tous cas je ne vois pas comment
c'est possible) générer des verrous.

Même s'il y a 50 SELECT déclenchés en même temps.... en quoi pourrait-
il y avoir un verrou ?

En tous cas je vous remercie pour votre réponse, elle me donne, à mon
avis, la solution ultime à mon problème mais me posera aussi pas mal de
problèmes plus tard =/

Antonio
Avatar
Cactus Corp.
Je suis aussi tombé sur le paramètre NOLOCK à placer dans la
requête SELECT. Cela pourrait-il m'aider dans la mesure où il
ne s'agit d'un système servant à afficher des articles et les
commentaires associés ?
Avatar
Cactus Corp.
> Je suis aussi tombé sur le paramètre NOLOCK à placer dans la
requête SELECT. Cela pourrait-il m'aider dans la mesure où il
ne s'agit d'un système servant à afficher des articles et les
commentaires associés ?



Je me réponds à moi-même hein , des fois que cela pourrait servir
à d'autres!

J'ai modifié les deux requêtes prioritaires (les plus demandées) :

SELECT * FROM tbl_news ...
SELECT * FROM tbl_commentaires...

en leur ajoutant le paramètre NOLOCK :

SELECT * FROM tbl_news WITH (NOLOCK) WHERE...
SELECT * FROM tbl_commentaires WITH (NOLOCK) WHERE...

Ca tourne depuis une vingtaine de minutes à présent et je n'ai pas encore
reçu de rapports d'erreurs! Je ne sais pas si c'est parce que tout le monde
mange ou si cette modification porte ses fruits...

A suivre..

Antonio
Avatar
Fred BROUARD
Cactus Corp. a écrit:
Bonjour Fred,

Votre proposition d'utiliser des procédures stockées me demanderait
de changer toute la conception de l'application et de la coupler au sgbd,
non ?



Oui, mais c'est vital pour une application susceptible d'être attaquée par de
nombreux utilisateurs (clients).


Ce qui m'ennuie un peu en faisant cela, c'est que jevais simplement
contourner le problème sans l'avoir réellement identifié.



Non, le problème est claire vous avez de la contention, c'est juste de savoir à
quel endroit elle se trouve qui vous gène.

> Pourtant, je veux
vraiment savoir ce qui ne joue pas.



Dans ce cas vous pouvez monitorer SQL Server à l'aide du profiler SQL afin de
déterminer les durées excessives des traitements.


Je crois qu'il me manque des connaissances théoriques sur ce point et
je ne sais pas précisemment où les trouver. J'étais convaincu qu'un SELECT
pouvait se faire totalement indépendamment des autres opérations en
cours dans la base.



Absoluement pas : une lecture nécessite la consistence des données. Si vous êtes
en train d'augementer de 10% le prix de tous vos produits il serait
catastrophique d'en extraire une partie avec la majoration et l'autre avec les
anciens prix sans savoir lequels ont été touchés par l'UPDATE...
C'est pourquoi il faut lire les données avant ou après mais pas pendant. D'ou
des mécanismes de verouillage pour gérer la concurrence.


Je pensais aussi qu'un UPDATE concernant une seule
table, une seule ligne, ne pouvait pas (en tous cas je ne vois pas comment
c'est possible) générer des verrous.

Même s'il y a 50 SELECT déclenchés en même temps.... en quoi pourrait-
il y avoir un verrou ?



En particulier lorsque vous lisez un verrou de type lecture partagée est posée.
pendant ce verrous certaines opérations sont infaisables :
- modifier les données,
- ajouter, supprimer ... une colonne à la table
- supprimer la table
...



En tous cas je vous remercie pour votre réponse, elle me donne, à mon
avis, la solution ultime à mon problème mais me posera aussi pas mal de
problèmes plus tard =/

Antonio






ATTENTION : les verrous sont posés automatiquement pas le serveur dans la cadre
des transaction. par principe, un ordre SQL comme SELECT ou UPDATE est une
transaction.

A +

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
Avatar
Fred BROUARD
bonjour,

Si vous voulez pourrir vos données, c'est en effet un excellent moyen que
d'utiliser la lecture sale (ou lecture impropre ou dirty read) en imposant que
le serveur s'affranchisse de tout verrou.

Avant toute chose, prenez du recul, réfléchissez, documentez-vous, formez-vous
afin de ne pas prendre un remède qui s'avérera pire que le mal.

Mon site SQLpro, comme mes bouquins, peuvent vous y aider.
http://sqlpro.developpez.com

Si vous êtes dans le cadre d'une entreprise, une bonne formation sur ces
concepts est sans doute nécessaire et peut être prise en charge par les fonds
mutualisés (FAFIEC, Agefoss....). Je ne sais pas si c'est valable pour la suisse
.... !

Cactus Corp. a écrit:
Je suis aussi tombé sur le paramètre NOLOCK à placer dans la
requête SELECT. Cela pourrait-il m'aider dans la mesure où il
ne s'agit d'un système servant à afficher des articles et les
commentaires associés ?





A +

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
Avatar
Fred BROUARD
Cactus Corp. a écrit:
Je suis aussi tombé sur le paramètre NOLOCK à placer dans la
requête SELECT. Cela pourrait-il m'aider dans la mesure où il
ne s'agit d'un système servant à afficher des articles et les
commentaires associés ?




Je me réponds à moi-même hein , des fois que cela pourrait servir
à d'autres!

J'ai modifié les deux requêtes prioritaires (les plus demandées) :

SELECT * FROM tbl_news ...
SELECT * FROM tbl_commentaires...

en leur ajoutant le paramètre NOLOCK :

SELECT * FROM tbl_news WITH (NOLOCK) WHERE...
SELECT * FROM tbl_commentaires WITH (NOLOCK) WHERE...

Ca tourne depuis une vingtaine de minutes à présent et je n'ai pas encore
reçu de rapports d'erreurs! Je ne sais pas si c'est parce que tout le monde
mange ou si cette modification porte ses fruits...



Vous n'en recevrez, espérons-le, jamais, même si vos données sont corrompues.
C'est le but du NOLOCK !

A +


A suivre..

Antonio






--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
Avatar
Cactus Corp.
Un grand merci pour toutes ces précisions !!!

Antonio
Avatar
Cactus Corp.
> Si vous voulez pourrir vos données, c'est en effet un excellent moyen que d'utiliser la lecture sale (ou lecture impropre ou dirty
read) en imposant que le serveur s'affranchisse de tout verrou.



Si vous vouliez me faire peur ou avoir mauvaise conscience c'est réussi ; )


Avant toute chose, prenez du recul, réfléchissez, documentez-vous, formez-vous afin de ne pas prendre un remède qui s'avérera pire
que le mal.



Oui, j'ai vu que je devais aller plus loin. Jusqu'à présent je n'ai encore jamais
rencontré ces problèmes et je me demande encore comment dans la mesure
où je ne fais rien de 'nouveau'. Rien qu'entre hier et aujourd'hui j'en ai appris
des trucs que j'étais censé savoir ; )


Mon site SQLpro, comme mes bouquins, peuvent vous y aider.
http://sqlpro.developpez.com



Oui, j'ai presque lu tous vos articles, il ne faut pas se voiler la face, presque
toutes les recherches pointent sur votre site depuis des années pour tout ce qui
touche à SQL en français, il faut le vouloir pour rater vos pages!

Par contre, je n'ai pas encore craqué pour les livres. Peut être simplement parce
que je n'ai jamais eu le besoin.

Je vais y refaire un tour, depuis le temps...


Si vous êtes dans le cadre d'une entreprise, une bonne formation sur ces concepts est sans doute nécessaire et peut être prise en
charge par les fonds mutualisés (FAFIEC, Agefoss....). Je ne sais pas si c'est valable pour la suisse .... !


100% auto-formation , et oui, je suis en suisse et dans une PME du genre microPME
; )

Encore merci!
Avatar
Ambassadeur Kosh
une idée simple : augmenter le timeout.

si vous utilisez la clef primaire pour identifier vos lignes, normallement,
ça doit aller super vite.
vous etes certains que vous ne nous faites pas le coup du "je rempli le
dataset avec les 1000000 de lignes, puis je trouve la ligne, je la modifie,
et j'update sur le dataAdapter" ?
1 2