jeoff | Je suis en train d'essayer les locks mais rien à faire, ca coince.
Est-il possible de locker une table en lecture/ecriture pour les autres threads sauf celui en cours ?
Parceque là je dois faire un select puis un update sur la même table mais :
- un lock read me bloque sur l'update,
- un lock write me bloque sur le select.
Je voudrais faire ça :
Code :
- connec->Send_Msg("LOCK TABLES file_palettisation WRITE, file_palettisation as file WRITE, bon_preparation WRITE, bon_preparation as bp WRITE;" );
- connec->Send_Msg("select file.no_bp,bp.lieu_stockage,bp.nb_colis_sur_zone from file_palettisation file,bon_preparation bp where file.no_bp='" + m_lst_file.GetItemText(m_lst_file.GetNextItem( -1, LVNI_FOCUSED ),3) + "' and (resa IS NULL or resa ='"+ connec->GetPortNum() +"') and file.no_bp=bp.no_bp order by bp.lieu_stockage asc;" );
- if (connec->recset[0][0]=="MySQL_no_result" )
- {
- //lafin.domodal
- MessageBox(_T("Cette mission vient d'être prise en charge. Choisissez en une autre !" ),_T("" ),MB_OK);
- RefreshTable() ;
- connec->Send_Msg("UNLOCK TABLES;" );
- }
- else
- {
- connec->Send_Msg("update file_palettisation set resa='"+ connec->GetPortNum() +"' where no_bp='" + m_lst_file.GetItemText(m_lst_file.GetNextItem( -1, LVNI_FOCUSED ),3) + "';" );
- connec->Send_Msg("UNLOCK TABLES;" );
- Count.init(m_lst_file.GetItemText(m_lst_file.GetNextItem( -1, LVNI_FOCUSED ),3),m_lbl_moreinfo,connec);
- Count.DoModal();
- Onquitter();
- }
|
L'utilisateur doit choisir une mission dans une liste su son pocket PC.
Il y a plusieurs utilisateurs et 1 Pocket PC par utilisateur.
Pour s'assurer que deux utilisateurs A et B ne peuvent avoir la même mission, lorsque le choix de la mission est validé par A, je veux poser un vérou sur ma table 'file_palettisation'.
Je fais un select sur cette table :
CAS 1 : Si un utilisateur B a pris cette mission entretemps, le champs resa n'est plus null, un message averti l'utilisateur et le vérou est levé.
CAS 2 : Si cette mission est libre, le champs resa est null, je fais alors un update du champs resa pour signaler que la mission n'est plus disponible. Je lève alors le vérou.
EDIT : apparement le problème vient de ma passerelle. J'ai l'impression que je crée autant de thread que de requêtes différentes donc une instruction lock est executée dans un thread et le select dans un autre ... va falloir faire quelques modifs en profondeur Message édité par jeoff le 25-01-2006 à 10:42:32
|