Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    56

    competizione in accesso multiplo

    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?

  2. #2
    lo sai che esiste il forum asp?

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    56

    Re: competizione in accesso multiplo

    Originariamente inviato da chida

    ...
    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.
    ...
    Guardati 12.4.6. SET TRANSACTION Syntax
    E' fatta apposta :-)

    GIo

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    56
    + precisamente dovresti mettere l' isolation level a serializable

    GIo

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    56
    Originariamente inviato da Roverandom
    lo sai che esiste il forum asp?

    grazie, ma il problema è su mysql, lo conosco poco e me ne sto appassionsndo da poco.

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2007
    Messaggi
    56
    Originariamente inviato da jot63
    Guardati 12.4.6. SET TRANSACTION Syntax
    E' fatta apposta :-)

    GIo
    grazie, ma non mi risolve il problema.
    Dimmi se sbaglio
    Ho letto qui http://database.html.it/guide/lezion...azioni-e-lock/
    e si evince che "L'uso delle transazioni permette di "consolidare" le modifiche alla base dati solo in un momento ben preciso"
    Ho capito che a se io avvio una transaction gli altri no vedono le modifiche fino a che io non faccio il commit.
    Il mio probelma è di non vedere le modifiche degli altri fino a che non finisco.
    esempio:
    tabella
    a b
    non mi serve 1
    l'ho già letto 1
    pippo 0
    pluto 0

    faccio una select dove estraggo tutti i record con 0
    select * from tabella where b=0
    poi visto che li ho letti porto gli 0 a 1
    update tabella set b = 0
    ma se qualcuno tra la select e l'update mi inserisce il recor
    a b
    caspita 0
    io lo valorizzo a 1 e non lo leggerò mai.
    quindi il mio problema non è le mie modifiche per gli altri, ma le modifiche degli altri sulla tabella.
    Potri bloccare la tabella, ma se ci metto diciamo 0,1 secondi per fare tutto se ho più di 100 utenti che fanno la stessa cosa sulla stessa tabella in un secondo (in una chat è possibile) allora accumolo ritardi su ritardi.

    è ovvio che ci sono soluzioni come fare una lettura e poi modificare i recor con ip letto tramite due sql, ma io vorrei ottimizzare in una store procedure il tutto. La cosa dovrebbe essere interessante, che consigli?

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2008
    Messaggi
    56
    Originariamente inviato da chida
    ...
    quindi il mio problema non è le mie modifiche per gli altri, ma le modifiche degli altri sulla tabella
    .....
    ma io vorrei ottimizzare in una store procedure il tutto. La cosa dovrebbe essere interessante, che consigli?
    ciao

    1) sbagli
    2) la set transaction con isolation level serializable e' *esattamente* quello che ti serve
    3) ti consiglio di usare la set transaction

    moltooooooo sinteticamente e senza citazioni :-)
    l'isolation level serializable fa si che ogni comando dml e' ripetibile e con lo stesso risultato all'interno della transazione(*)

    in altre parole ogni select all'interno di una transazione serializable dara' sempre lo stesso numero e contenuto delle righe a prescindere da quello che fanno o tentano di fare le altre sessioni.

    per transazione intendo tutto quello che c'e' tra un comando SET TRANSACTION e COMMIT o ROLLBACK

    GIo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.