Afhandeling meerdere SQL queries
Nadat een gebruiker een form heeft ingevult plaats ik deze data in de database. Dit gaat dan in meerdere tabellen.
Nu vraag ik mij af wat de juiste manier is om hier mee om te gaan. Op dit ogenblik draai ik in dit geval uiteindelijk 3 queries om de data in alle tabellen te krijgen. Maar wat nu als bv de 2e of 3e query mislukt?
Is er een mogelijkheid om de 3 queries in 1x uit te voeren? Of moet dit echt per stuk? En hoe moet je er mee om gaan als den 2e of 3e query faalt?
Nu vraag ik mij af wat de juiste manier is om hier mee om te gaan. Op dit ogenblik draai ik in dit geval uiteindelijk 3 queries om de data in alle tabellen te krijgen. Maar wat nu als bv de 2e of 3e query mislukt?
Is er een mogelijkheid om de 3 queries in 1x uit te voeren? Of moet dit echt per stuk? En hoe moet je er mee om gaan als den 2e of 3e query faalt?
Je kan niet verschillende data in één insert query plaatsen voor meerdere tabellen. Dit is opzich ook helemaal niet nodig...
Wat als er een query fout gaat? Zorg ervoor dat je een error reporting heb zodat je weet dat het niet goed gaat, maar waarom zou een insert fout gaan?
Wat als er een query fout gaat? Zorg ervoor dat je een error reporting heb zodat je weet dat het niet goed gaat, maar waarom zou een insert fout gaan?
Waarom een insert fout kan gaan? Te veel verbindingen, te weinig geheugen etc...
Ik weet nog niet precies welke, maar in 99,8% van de gevallen gaat het goed. Alleen die 0,2% niet. Waar het aan ligt? Wist ik het maar.
Het zorgt wel voor vervuiling en niet werkende onderdelen als ik er vanuit ga dat een insert altijd goed gaat. Want het ene deel van de gegevens staan in de ene tabel, maar de andere gegevens zijn niet te vinden in de andere tabel(len)
Daarom vroeg ik mij af wat hier de juiste methode voor is. Of ben ik een uitzonderlijk geval waarbij een insert mis gaat?
Ik weet nog niet precies welke, maar in 99,8% van de gevallen gaat het goed. Alleen die 0,2% niet. Waar het aan ligt? Wist ik het maar.
Het zorgt wel voor vervuiling en niet werkende onderdelen als ik er vanuit ga dat een insert altijd goed gaat. Want het ene deel van de gegevens staan in de ene tabel, maar de andere gegevens zijn niet te vinden in de andere tabel(len)
Daarom vroeg ik mij af wat hier de juiste methode voor is. Of ben ik een uitzonderlijk geval waarbij een insert mis gaat?
Normaal gesproken zou een insert niet fout mogen gaan, dan is er echt iets niet goed aan de server. Wat je zou kunnen doen als één van de queries fout gaat een delete query draaien die dan de gegevens die pas ingevoerd zijn weer verwijderd.
Dan heb je geen gegevens die er voor de helft instaan
Dan heb je geen gegevens die er voor de helft instaan
Daarvoor bestaan transactions, zie hier
Ger van Steenderen op 21/09/2012 10:35:56:
Daarvoor bestaan transactions, zie hier
Dit kan niet als je database draait in MyISAM
@Ger
Dank je! Goede tip, ga ik me eens in verdiepen.
@Marvin
Das dan weer balen... BTW weet je ook waarom niet op MyISAM?
En ik ga eens kijken wat er eventueel op mijn server gebeurt...
Dank je! Goede tip, ga ik me eens in verdiepen.
@Marvin
Das dan weer balen... BTW weet je ook waarom niet op MyISAM?
En ik ga eens kijken wat er eventueel op mijn server gebeurt...
Gewijzigd op 21/09/2012 10:58:42 door Sander Z
MySQL op MyISAM is gewoon niet transactioneel gebouwd, eigenlijk is MyISAM wat oudere technologie voor MySQL, voordeel is wel dat het razendsnel is dus het wordt nog veel gebruikt. je innodb status dat opvragen met:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
mysql> show status where variable_name like 'inno%';
+---------------------------------------+---------+
| Variable_name | Value |
+---------------------------------------+---------+
| Innodb_buffer_pool_pages_data | 294 |
| Innodb_buffer_pool_pages_dirty | 0 |
| Innodb_buffer_pool_pages_flushed | 0 |
| Innodb_buffer_pool_pages_free | 1817 |
| Innodb_buffer_pool_pages_misc | 1 |
| Innodb_buffer_pool_pages_total | 2112 |
| Innodb_buffer_pool_read_ahead_rnd | 0 |
| Innodb_buffer_pool_read_ahead | 0 |
| Innodb_buffer_pool_read_ahead_evicted | 0 |
| Innodb_buffer_pool_read_requests | 60564 |
| Innodb_buffer_pool_reads | 295 |
| Innodb_buffer_pool_wait_free | 0 |
| Innodb_buffer_pool_write_requests | 0 |
| Innodb_data_fsyncs | 3 |
| Innodb_data_pending_fsyncs | 0 |
| Innodb_data_pending_reads | 0 |
| Innodb_data_pending_writes | 0 |
| Innodb_data_read | 7016448 |
| Innodb_data_reads | 305 |
| Innodb_data_writes | 3 |
| Innodb_data_written | 1536 |
| Innodb_dblwr_pages_written | 0 |
| Innodb_dblwr_writes | 0 |
| Innodb_have_atomic_builtins | ON |
| Innodb_log_waits | 0 |
| Innodb_log_write_requests | 0 |
| Innodb_log_writes | 1 |
| Innodb_os_log_fsyncs | 3 |
| Innodb_os_log_pending_fsyncs | 0 |
| Innodb_os_log_pending_writes | 0 |
| Innodb_os_log_written | 512 |
| Innodb_page_size | 16384 |
| Innodb_pages_created | 0 |
| Innodb_pages_read | 294 |
| Innodb_pages_written | 0 |
| Innodb_row_lock_current_waits | 0 |
| Innodb_row_lock_time | 0 |
| Innodb_row_lock_time_avg | 0 |
| Innodb_row_lock_time_max | 0 |
| Innodb_row_lock_waits | 0 |
| Innodb_rows_deleted | 0 |
| Innodb_rows_inserted | 0 |
| Innodb_rows_read | 0 |
| Innodb_rows_updated | 0 |
| Innodb_truncated_status_writes | 0 |
+---------------------------------------+---------+
45 rows in set (0.02 sec)
+---------------------------------------+---------+
| Variable_name | Value |
+---------------------------------------+---------+
| Innodb_buffer_pool_pages_data | 294 |
| Innodb_buffer_pool_pages_dirty | 0 |
| Innodb_buffer_pool_pages_flushed | 0 |
| Innodb_buffer_pool_pages_free | 1817 |
| Innodb_buffer_pool_pages_misc | 1 |
| Innodb_buffer_pool_pages_total | 2112 |
| Innodb_buffer_pool_read_ahead_rnd | 0 |
| Innodb_buffer_pool_read_ahead | 0 |
| Innodb_buffer_pool_read_ahead_evicted | 0 |
| Innodb_buffer_pool_read_requests | 60564 |
| Innodb_buffer_pool_reads | 295 |
| Innodb_buffer_pool_wait_free | 0 |
| Innodb_buffer_pool_write_requests | 0 |
| Innodb_data_fsyncs | 3 |
| Innodb_data_pending_fsyncs | 0 |
| Innodb_data_pending_reads | 0 |
| Innodb_data_pending_writes | 0 |
| Innodb_data_read | 7016448 |
| Innodb_data_reads | 305 |
| Innodb_data_writes | 3 |
| Innodb_data_written | 1536 |
| Innodb_dblwr_pages_written | 0 |
| Innodb_dblwr_writes | 0 |
| Innodb_have_atomic_builtins | ON |
| Innodb_log_waits | 0 |
| Innodb_log_write_requests | 0 |
| Innodb_log_writes | 1 |
| Innodb_os_log_fsyncs | 3 |
| Innodb_os_log_pending_fsyncs | 0 |
| Innodb_os_log_pending_writes | 0 |
| Innodb_os_log_written | 512 |
| Innodb_page_size | 16384 |
| Innodb_pages_created | 0 |
| Innodb_pages_read | 294 |
| Innodb_pages_written | 0 |
| Innodb_row_lock_current_waits | 0 |
| Innodb_row_lock_time | 0 |
| Innodb_row_lock_time_avg | 0 |
| Innodb_row_lock_time_max | 0 |
| Innodb_row_lock_waits | 0 |
| Innodb_rows_deleted | 0 |
| Innodb_rows_inserted | 0 |
| Innodb_rows_read | 0 |
| Innodb_rows_updated | 0 |
| Innodb_truncated_status_writes | 0 |
+---------------------------------------+---------+
45 rows in set (0.02 sec)
Gewijzigd op 21/09/2012 11:09:00 door John D
Je kan je tabellen gelijk omzetten naar InnoDB. Zonder gegevens te verliezen zelfs. Je kan het bijvoorbeeld met een tool zoals phpMyAdmin.
Kijk, ik heb van het weekend weer genoeg te doen! :)




