Kan iemand mij uitleggen hoe dit nu precies zit.
Stel ik heb een stored procedure met een opbouw als (even snel uit mijn hoofd getypt aangezien ik mijn daadwerkelijke queries niet bij de hand heb)..
BEGIN
INSERT INTO test(a,b,c,d) SELECT (a,b,c,1) FROM test WHERE (a > 10 or b > 10) and d = 0;
hier maak ik een kopie van de records die ik ga wijzigingen (voor history).
Vervolgens update ik de originele records:
update test set a = a+1 WHERE a > 10 and d = 0;
update test set b = b+1 WHERE b > 10 and d = 0;
Tenslotte voeg ik in mijn stored procedure nog 1 nieuw record toe:
INSERT INTO test(a,b,c) VALUES(1,1,'iets');
END;
Op zich werkt het hele verhaal perfect. Echter nu stop ik even een "SELECT sleep(10); tussen de 2 update statements.
Vervolgens open ik 2 mysql clients in 1 roep ik de stored procedure aan en vervolgens roep ik tijdens de sleep in de 2e console nogmaals dezelfde stored procedure aan. Op dit moment gaat het helemaal mis. Aangezien je in Mysql geen tables direct mag locken binnen een stored procedure heb ik geprobeerd om de stored procedure te beginnen met START TRANSACTION; en af te sluiten met COMMIT; echter lost dit het probleem helaas niet op.
Wat ik wil is dat op het moment dat een stored procedure aangeroepen wordt er niks anders op de tabel mag uitgevoerd worden tot de stored procedure geheel is afgerond. Maar alles wat dus op dat moment staat te wachten moet dus uitgevoerd worden op de tabel zoals hij is NADAT de stored procedure is afgerond, dus ook bijvoorbeeld het insert record na de sleep, maar voor de commit.
Ik hoop dat mijn vraag zo eenbeetje duidelijk is en iemand mij uit kan leggen hoe ik dit voor elkaar kan krijgen.
Stel ik heb een stored procedure met een opbouw als (even snel uit mijn hoofd getypt aangezien ik mijn daadwerkelijke queries niet bij de hand heb)..
BEGIN
INSERT INTO test(a,b,c,d) SELECT (a,b,c,1) FROM test WHERE (a > 10 or b > 10) and d = 0;
hier maak ik een kopie van de records die ik ga wijzigingen (voor history).
Vervolgens update ik de originele records:
update test set a = a+1 WHERE a > 10 and d = 0;
update test set b = b+1 WHERE b > 10 and d = 0;
Tenslotte voeg ik in mijn stored procedure nog 1 nieuw record toe:
INSERT INTO test(a,b,c) VALUES(1,1,'iets');
END;
Op zich werkt het hele verhaal perfect. Echter nu stop ik even een "SELECT sleep(10); tussen de 2 update statements.
Vervolgens open ik 2 mysql clients in 1 roep ik de stored procedure aan en vervolgens roep ik tijdens de sleep in de 2e console nogmaals dezelfde stored procedure aan. Op dit moment gaat het helemaal mis. Aangezien je in Mysql geen tables direct mag locken binnen een stored procedure heb ik geprobeerd om de stored procedure te beginnen met START TRANSACTION; en af te sluiten met COMMIT; echter lost dit het probleem helaas niet op.
Wat ik wil is dat op het moment dat een stored procedure aangeroepen wordt er niks anders op de tabel mag uitgevoerd worden tot de stored procedure geheel is afgerond. Maar alles wat dus op dat moment staat te wachten moet dus uitgevoerd worden op de tabel zoals hij is NADAT de stored procedure is afgerond, dus ook bijvoorbeeld het insert record na de sleep, maar voor de commit.
Ik hoop dat mijn vraag zo eenbeetje duidelijk is en iemand mij uit kan leggen hoe ik dit voor elkaar kan krijgen.
Currently playing: MTG Arena (PC)