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:
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 ;
è possibile che qualcuno faccia un insert in main_chat prima che io faccia l'update su main_chat?
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.
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 $$
Potete aiutarmi?