Database transacties zijn je antwoord. Hoewel deze nog niet uitgebreid getest zijn in MySQL. Je hebt max-binary nodig van een hogere 3.23.x versie of de standaard binary van de alpha versie 4.x
Of je kunt natuurlijk zelf compilen met --with-innodb. Maar de meeste isp's die MySQL ondersteuning hebben nog geen versie die transacties ondersteunt (mede door de expirimentele status).
Kenmerk van een transactie is dat hij de veranderingen alleen voor de connectie waarbinnen de transactie zich afspeelt registreerd, en alle veranderingen in 1 keer op commando naar de schijf wegschrijft zodat het ook voor anderen zichtbaar is.
voorbeeld in pseudo code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| //mysql pseudo code
query "SET AUTOCOMMIT=0"
query "BEGIN"
query "INSERT ..."
if insert_failed //check of de query gelukt is en of het het gewenste resultaat had
//insert niet gelukt: terugdraaien
query "ROLLBACK"
query "SET AUTOCOMMIT=1"
else
//insert gelukt ga verder
query "UPDATE ..."
if update_failed //idem als bij insert_failed
//update niet gelukt draai alles terug (ook insert)
query "ROLLBACK"
query "SET AUTOCOMMIT=1"
else
//alles gelukt, schrijf naar schijf
query "COMMIT"
query "SET AUTOCOMMIT=1" |
Nogmaals, MySQL is neit de meest geschikte dbms hiervoor, ik zou een 'echte' dbms nemen. Maar daarbij is het idee erachter hetzelfde, alleen kun je bij die dbmssen de "SET AUTOCOMMIT" querys vaak achterwege laten.
zie ook:
http://hotwired.lycos.com.../tutorials/tutorial2.html
edit:
Gratis 'echte' DBMS-en zijn Postgresql (open-source), Sybase Adaptive Server (Een oudere versie is gratis down te loaden voor linux), Interbase (Een oudere versie is ooit eens opensourced, CVS tree is nog steeds opensource) en Firebird (Een fork van interbase)