Acces simultanné à une base des donnée

Résolu
notrica Messages postés 89 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 19 octobre 2013 - 21 août 2009 à 23:46
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 - 17 sept. 2009 à 20:37
Salut
J'utilise SQL Server 2005, un programme est exécuter par deux utilisateurs, lorsque le 1er utilisateur sauve un enregistrement dans la base des données, le 2ème ne saura plus poster l'enregistrement dans la base des données. Un message du genre "La ligne n'a pas pu être trouvée pour la mise à jour. Certaines valeurs ont peut être changé depuis leur dernière lecture". Que faire pour que les 2 utilisateurs travaillent sans se message d'erreur.
a+
Notrica

39 réponses

cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
26 août 2009 à 19:15
le deuxième utilisateur ne saura plus, un message "La ligne n'a pas été trouvé pour la mise à jour. Certaines valeurs ont peut-être changées depuis leur première lecture" s'affiche.

tu veux dire que le message ne s'affiche plus ?


cantador
0
notrica Messages postés 89 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 19 octobre 2013
27 août 2009 à 17:18
le message continue de s'afficher et que les données du deuxième utilisateur ne sont pas sauvegardées. c.a.d. l'accès pour la sauvegarde des données du deuxième utilisateur sur la base des données sur le serveur est quasi impossible. La lecture ne pose aucun problème.
j'ai en réseau un serveur win 2003 sur lequel est installé le SQL-Serveur
Que dois-je faire pour que tout le monde accède en écriture sur la base ?
a+
Notrica
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
27 août 2009 à 18:49
Désolé, j'ai oublié de te préciser que tu dois travailler en mode transactionnel..

il faut donc encapsuler chacune de tes procédures par des :

beginTrans, commitTrans ou RollBackTrans..

cantador
0
notrica Messages postés 89 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 19 octobre 2013
27 août 2009 à 23:22
Merci Cantador de m'avoir soutenu, je modifie toutes les procedures et vous tiendrez au courant de l'évolution.
a+
Notrica
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
notrica Messages postés 89 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 19 octobre 2013
7 sept. 2009 à 01:27
[list]
Salut Cantador
Voila, mon problème n'a pas été résolut. Voici le message qu'il m'affiche
'Aucune transaction n'est active'. Que faire?.
je m'explique encore, la base de données est verrouillée lorsque le 1er utilisateur sauve un enregistrement, le 2eme qui chercher a sauver son enregistrement n'y arrive plus. cela génère le message ci-dessus.
d'avance merci
a+
Notrica
/list
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
7 sept. 2009 à 13:59
as-tu encapsuler tes écritures comme indiqué précédemment ?


cantador
0
notrica Messages postés 89 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 19 octobre 2013
7 sept. 2009 à 23:24
tout a été fait comme vous l'avez demandé. veuillez trouver la partie de sauvergarde ci-dessous :


DMPlanet1.AdoIbPlanet.BeginTrans; // Début de la transaction
try
DMPlanet1.AdoIbPlanet.CommitTrans; // Début de la transaction
with DMPlanet1 do begin
QClients.active := False;
QClients.Sql.Clear;
QClients.Sql.Add('Select * from TFClients Order By ClientID');
QClients.active := True;
QClients.First;

if not QClients.Locate('ClientID',RzEdit37.Text,[]) then begin
QClients.Insert;
QClientsClientID.AsString :=RzEdit37.Text;
QClientsUserCrea.AsString := FrmMain.wwwNomUtil;
QClientsDateCrea.AsDateTime := Date;
QClientsHeureCrea.AsDateTime := Time;
end
else begin
QClients.Edit;
xmodif := 1;
// FieldByName('Nom_Modif').AsString :=RxLabel5.Caption ;
// FieldByName('Date_Modif').AsString := FormatDateTime('dd-mmm-yyyy',Date);
// FieldByName('Heure_Modif').AsString := FormatDateTime('hh:nn:ss',Time);
end;
QClientsNomClient.AsString :=RzEdit38.Text;
QClientsAdresse.AsString :=RzMemo2.Text;
QClientsAdressBus.AsString :=RzBitBtn3.Caption;
QClientsTelBus.AsString :=RxLabel71.Caption;
QClientsTelFax.AsString :=RxLabel60.Caption;
QClientsPhone.AsString :=RzEdit41.Text;
QClientsFax.AsString :=RzEdit42.Text;
QClientsEmail.AsString :=RzEdit39.Text;
QClientsPageWeb.AsString := RzEdit40.Text ;
QClientsStatus.AsBoolean :=RzCheckBox1.Checked;
QClientsDateOuv.AsString :=RzDateTimeEdit1.Text;
QClientsMntBal.AsInteger :=RzNumericEdit1.IntValue;
QClientsMntBalUS.Value := RzNumericEdit1.Value/FrmMain.wwTxChange;
QClientsDateBal.AsString :=RzDateTimeEdit2.Text;
QClientsMemo.AsString :=RzMemo1.Text;
QClientsAjouteLien.AsString :=RzEdit43.Text;
QClientsNomClient.AsString :=RzEdit38.Text;
QClientsLimiteCredit.AsString :=RzEdit1.Text;
QClientsPrix.AsString :=RzComboBox2.Text;
QClientsCredit.AsString :=RzCombobox3.Text;
QClientsMethExp.AsString :=RzCombobox4.Text;
QClientsMethPyt.AsString :=RzCombobox5.Text;
QClientsCondPyt.AsString :=RzCombobox6.Text;
QClientsClientGrp.AsString :=RzCombobox7.Text;
QClientsTaxGrp.AsString :=RzComboBox8.Text;
QClientsGLCompte.AsString :=CpteClient;

QClients.Post;
QClients.Refresh;
end;
except
DMPlanet1.AdoIbPlanet.RollbackTrans;
end;



d'avance merci
a+
Notrica
0
notrica Messages postés 89 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 19 octobre 2013
7 sept. 2009 à 23:50
Peut-il s'agir des problèmes d'index ?
a+
Notrica
0
notrica Messages postés 89 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 19 octobre 2013
8 sept. 2009 à 18:07
Salut Cantador,
Merci bcp de votre intervention, tout est bon. Je vous souhaite bonne continuité sur cs.
a+
Notrica
0
notrica Messages postés 89 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 19 octobre 2013
9 sept. 2009 à 00:59
un problème s'est posé, l'enregistrement du 2ème utilisateur est introuvable dans la base des données. que faire ?
a+
Notrica
0
notrica Messages postés 89 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 19 octobre 2013
9 sept. 2009 à 01:49
Salut Cantador,

voici le le code après avoir encapsulé les écritures:


try
DMPlanet1.AdoIbPlanet.BeginTrans; // Début de la transaction
with DMPlanet1 do begin
QClients.active := False;
QClients.Sql.Clear;
QClients.Sql.Add('Select * from TFClients Order By ClientID');
QClients.active := True;
QClients.First;
// if not Locate('CompteID',RzEdit1.Text,[loPartialKey]) then
if not QClients.Locate('ClientID',RzEdit37.Text,[]) then begin
QClients.Insert;
QClientsClientID.AsString :=RzEdit37.Text;
QClientsUserCrea.AsString := FrmMain.wwwNomUtil;
//** FieldByName('DateCrea').AsString := FormatDateTime('dd-mmm-yyyy',Date);
QClientsDateCrea.AsDateTime := Date;
QClientsHeureCrea.AsDateTime := Time;
end
else begin
QClients.Edit;
xmodif := 1;
// FieldByName('Nom_Modif').AsString :=RxLabel5.Caption ;
// FieldByName('Date_Modif').AsString := FormatDateTime('dd-mmm-yyyy',Date);
// FieldByName('Heure_Modif').AsString := FormatDateTime('hh:nn:ss',Time);
end;
QClientsNomClient.AsString :=RzEdit38.Text;
QClientsAdresse.AsString :=RzMemo2.Text;
QClientsAdressBus.AsString :=RzBitBtn3.Caption;
QClientsTelBus.AsString :=RxLabel71.Caption;
QClientsTelFax.AsString :=RxLabel60.Caption;
QClientsPhone.AsString :=RzEdit41.Text;
QClientsFax.AsString :=RzEdit42.Text;
QClientsEmail.AsString :=RzEdit39.Text;
QClientsPageWeb.AsString := RzEdit40.Text ;
QClientsStatus.AsBoolean :=RzCheckBox1.Checked;
QClientsDateOuv.AsString :=RzDateTimeEdit1.Text;
QClientsMntBal.AsInteger :=RzNumericEdit1.IntValue;
QClientsMntBalUS.Value := RzNumericEdit1.Value/FrmMain.wwTxChange;
QClientsDateBal.AsString :=RzDateTimeEdit2.Text;
QClientsMemo.AsString :=RzMemo1.Text;
QClientsAjouteLien.AsString :=RzEdit43.Text;
QClientsNomClient.AsString :=RzEdit38.Text;
QClientsLimiteCredit.AsString :=RzEdit1.Text;
QClientsPrix.AsString :=RzComboBox2.Text;
QClientsCredit.AsString :=RzCombobox3.Text;
QClientsMethExp.AsString :=RzCombobox4.Text;
QClientsMethPyt.AsString :=RzCombobox5.Text;
QClientsCondPyt.AsString :=RzCombobox6.Text;
QClientsClientGrp.AsString :=RzCombobox7.Text;
QClientsTaxGrp.AsString :=RzComboBox8.Text;
QClientsGLCompte.AsString :=CpteClient;

QClients.Post;
QClients.Refresh;
DMPlanet1.AdoIbPlanet.CommitTrans; // Début de la transaction
end;
except
if DMPlanet1.AdoIbPlanet.InTransaction then
DMPlanet1.AdoIbPlanet.RollbackTrans;
end;



Que faire pour que les enregistrement du 2ème utilisateur soit sauvegarder dans la base de données ?

a+
Notrica
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
9 sept. 2009 à 16:10
Evite le refresh entre le post et le commit mets le après.
cela ne vient pas du code car celui-ci est bien écrit.
Le premier utilisateur enregistre d'ailleurs bien les données mais le second déclenche vraisemblablement le rollback..

il faudrait savoir pourquoi ?

inhibe le rollback temporairement afin de déclencher un message d'erreur.

Mais je pense que cela vient de la propriété
IsolationLevel qui n'a pas été correctement fixée

cantador
0
notrica Messages postés 89 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 19 octobre 2013
10 sept. 2009 à 00:01
voici le message déclenché "La ligne n'a pas pu être trouvée pour la mise à jour. Certaines valeurs ont peut-être changé depuis leur dernière lecture."Ce message est affiché lors de la sauvegarde de l'enregistrement du 2ème urilisateur.
Merci d'avance.
a+
Notrica
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
10 sept. 2009 à 07:59
voir ma réponse sur isolationlevel..

cantador
0
notrica Messages postés 89 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 19 octobre 2013
10 sept. 2009 à 21:27
j'ai sélectionné l'option ilReadCommitted comme vous l'aviez recommandé. Le résultat reste le même càd le message continue à s'afficher. Je me connect à une base des données SQL-Serveur sous Serveur 2003.
Que faire ?
0
notrica Messages postés 89 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 19 octobre 2013
10 sept. 2009 à 22:06
je corrige ce que dit tout à l'heure. Lorsque deux utilisateurs travaillent sur un même dossier par ex. la mise à jour des clients, le 1er peur poster son enregistrement, mais le 2ème utilisateur n'y arrivera pas d'où le message dont ci-haut. Mais je constate que lorsque ils travaillent sur des dossiers différents par ex. client et l'autre sur fournisseurs, celà est devenu normal càd bon pas de message, Faut-t'il conclure que c'est impossible que 2 utilisateurs travaillent sur un même dossier ?.
Je suis ravi qu'une partie de solution soit trouvé.

Merci Cantador.
a+
Notrica
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
10 sept. 2009 à 22:19
bon ya du mieux..
mais si les clics arrivent en même temps sur le même dossier..
ce qui en pratique est extrêmement rare(probabilité très faible)

c'est normal..

mais en revanche si la première transaction se termine alors l'autre doit pouvoir fonctionner.
s'il y a collision alors tu peux gérer à l'aide de messages appropriés :
"une transaction est en cours veuillez renouveler votre action ultérieurement".

En revanche, il me semble qu'il y a une possiblité de prendre la main...
mais pas je ne l'ai pas encore utilisée (trop problèmatique...)

cantador
0
notrica Messages postés 89 Date d'inscription lundi 12 décembre 2005 Statut Membre Dernière intervention 19 octobre 2013
10 sept. 2009 à 22:58
je m'excuse, j'ai oublié d'inhiber le RollBacktrans du 2ème dossier. Sinon le message persiste. Même si le 2ème fait la mise à jour dans un autre dossier, ce message apparaît.Donc cet enregistrement ne pas pris en compte, il est perdu.
Que faire ?
a+
Notrica
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
11 sept. 2009 à 13:41
il faut vérifier si les utilisateurs ont tous accès au dossier de la base sur le serveur

essaie aussi un autre niveau d'isolation par précaution :


SQLSetIsolation

Read IsolationLevel after the transaction has been activated to determine the actual transaction isolation level used. It is possible that a server will force an isolation level other than that requested if the level requested is not supported.

Isolation TYPES

ilUnspecified Server is using a an isolation level other than what was requested and the specific isolation level cannot be determined.
ilChaos Changes from more highly isolated transactions cannot be overwritten by the current connection.
ilReadUncommitted Uncommitted changes in other transactions are visible.
ilBrowse Uncommitted changes in other transactions are visible.
ilCursorStability Changes from other transactions only visible after being committed.
ilReadCommitted Changes from other transactions only visible after being committed.

ilRepeatableRead Changes made in other transactions not visible, but requerying can retrieve new recordsets.
ilSerializable Transactions conducted in isolation from other transactions.
ilIsolated Transactions conducted in isolation from other transactions.




cantador
0
Rejoignez-nous