Salve,
ho bisogno di una chiarificazione, quando unaa store procedures è in esecuzione Mysql aspetta di processare altre richieste per lo stesso database fino a che non ha finito la procedura?
il problema nasce dal fatto di fare una select e poi un update e non vorrei che la situazione su una tabella si modificasse tra la select e update.
la store procedures:
è possibile che qualcuno faccia un insert in main_chat prima che io faccia l'update su main_chat?codice:DELIMITER $$ DROP PROCEDURE IF EXISTS `moochat`.`get` $$ CREATE PROCEDURE `moochat`.`get` (IN partecipante integer, IN room varchar(45) ) BEGIN update chat set data=now() where chat = room and utente = partecipante; lock tables `main_chat`; select m.testo from messaggi as m inner join main_chat as c on c.testo_id=m.id where c.visualizzato=0 and c.destinatario=partecipante and c.chat=room order by m.data; //è possibile che qualcuno faccia un insert in main_chat prima che io faccia l'update su main_chat? update main_chat set main_chat.visualizzato=1 where main_chat.visualizzato=0 and main_chat.destinatario=partecipante and main_chat.chat=room; unlock tables; END $$ DELIMITER ;
Non vorrei usare 'lock table' poichè è un procedura che faccio spessissimo e alla lunga avrei le tabelle sempre bloccate
Ho provato a modificare la procedura in questa sotto, ma ho problemi nel recordset in asp perchè mi ritrovo solo l'ultima select del ciclo.
Questa risolverebbe il problema perchè leggo e mi porto dietro l'id dei recordset da modificare, ma come posso ricevere i dati che leggo fuori?, al momento pare che anche se ho tre record, il recordset legge l'ultimo.
Potete aiutarmi?codice:BEGIN DECLARE a VARCHAR(255) default null; DECLARE b INT default null; DECLARE finito TINYINT(1) default 0; DECLARE cur CURSOR FOR select m.testo,c.id from messaggi as m inner join main_chat as c on c.testo_id=m.id where c.visualizzato=0 and c.destinatario=partecipante and c.chat=room order by m.data; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET finito = 1; update chat set data=now() where chat = room and utente = partecipante; OPEN cur; FETCH cur INTO a,b; ciclo: WHILE NOT finito DO //select and update FETCH cur INTO a,b; END WHILE ciclo; CLOSE cur; END $$

Rispondi quotando