Stel ik heb de volgende tabel:
Deze tabel is onderdeel van een programma die het aantal dieren telt, en bijhoudt hoeveel van elk soort is geteld. De code die ik op dit moment schrijf ziet er ongeveer zo uit, in pseudocode:
Let op het feit dat ik table locks gebruik. Ik doe dat om concurrency problemen te voorkomen: want als meerdere computers dieren gaan tellen, maar gebruik maken van dezelfde database, en je lockt niet, dan kan het voorkomen dat een rij eigenlijk dubbel ingevoegd wordt. Ik wil dus alleen maar een rij invoegen als dat nodig is.
Deze code werkt prima, maar table locks zijn vrij duur. Is er een manier om van die table locks af te komen? Ik heb al geprobeerd om transactie te gebruiken met SERIALIZABLE als transactie niveau, maar MySQL 5 zegt dan dat ie een deadlock detecteert.
code:
1
2
3
4
5
| CREATE TABLE soort ( naam VARCHAR(100) NOT NULL, aantal INT UNSIGNED NOT NULL, PRIMARY KEY (naam) ); |
Deze tabel is onderdeel van een programma die het aantal dieren telt, en bijhoudt hoeveel van elk soort is geteld. De code die ik op dit moment schrijf ziet er ongeveer zo uit, in pseudocode:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
| function tel($naam) {
sql("LOCK TABLES soort READ");
sql("LOCK TABLES soort WRITE");
sql("SELECT * FROM soort WHERE naam = $naam");
if (SELECT retourneert een rij) {
// Er is al een soort met deze naam.
sql("UPDATE soort SET aantal = aantal + 1 WHERE naam = $naam");
} else {
// Deze soort bestaat niet in de database, dus voeg het toe.
sql("INSERT INTO soort VALUES($naam, 1)");
}
sql("UNLOCK TABLES");
} |
Let op het feit dat ik table locks gebruik. Ik doe dat om concurrency problemen te voorkomen: want als meerdere computers dieren gaan tellen, maar gebruik maken van dezelfde database, en je lockt niet, dan kan het voorkomen dat een rij eigenlijk dubbel ingevoegd wordt. Ik wil dus alleen maar een rij invoegen als dat nodig is.
Deze code werkt prima, maar table locks zijn vrij duur. Is er een manier om van die table locks af te komen? Ik heb al geprobeerd om transactie te gebruiken met SERIALIZABLE als transactie niveau, maar MySQL 5 zegt dan dat ie een deadlock detecteert.
[ Voor 3% gewijzigd door FooBarWidget op 10-12-2006 16:28 ]