Hoi allemaal,
Voor een project heb ik een Postgres database op een lokale linux server staan. Hier ben ik een front-end voor aan het maken met behulp van Visual Basic (6) en de ODBC drivers van http://odbc.postgresql.org/. Dit werkt als een trein, op (jaja) een ding na.
Het programma moet door meerdere gebruikers tegelijkertijd gebruikt kunnen worden. Met name de tabel 'artikel' moet door meerdere mensen tegelijk bewerkt kunnen worden.
Nu heb ik na wat lezen/zoeken het "SELECT FOR UPDATE" statement gevonden. Dit "locked" het record wat je gelezen hebt, totdat je de transactie commit/rollback-ed.
Pseudo
Voer ik het programma op twee verschillende pc's uit dan kan ik op PC1 netjes een artikel openen, welke vervolgens op PC2 niet geopend kan worden. Er wordt echter geen time-out/error gegenereerd bij het uitvoeren van de "SELECT FOR UPDATE". VB blijft hier gewoon op hangen, totdat ik op PC1 het record weer vrijgeef.
Ik heb al verschillende dingen als de "ConnectionTimeout" en de "CommandTimeout" properties gebruikt, maar zonder resultaat. Toen kwam ik erachter dat als ik gewoon met de command-line client van postgres een "SELECT" doe op een record dat in VB gelocked is, er ook geen foutmelding/timeout optreedt. Het programma wacht gewoon totdat de transactie voltooid is. Op zich kan dit best handig zijn, maar in mijn geval wil ik de gebruiker gewoon melden dat het record in gebruik is en dat ie het later nog maar eens moet proberen.
Iemand een idee hoe ik dit gedrag van postgres kan veranderen ? (zowel de admin- als de user manual van postgres boden geen soelaas)
Voor een project heb ik een Postgres database op een lokale linux server staan. Hier ben ik een front-end voor aan het maken met behulp van Visual Basic (6) en de ODBC drivers van http://odbc.postgresql.org/. Dit werkt als een trein, op (jaja) een ding na.
Het programma moet door meerdere gebruikers tegelijkertijd gebruikt kunnen worden. Met name de tabel 'artikel' moet door meerdere mensen tegelijk bewerkt kunnen worden.
Nu heb ik na wat lezen/zoeken het "SELECT FOR UPDATE" statement gevonden. Dit "locked" het record wat je gelezen hebt, totdat je de transactie commit/rollback-ed.
Pseudo
code:
1
2
3
4
5
| DB.Execute "SELECT bla FROM artikel FOR UPDATE" // Bewerk artikel DB.Commit |
Voer ik het programma op twee verschillende pc's uit dan kan ik op PC1 netjes een artikel openen, welke vervolgens op PC2 niet geopend kan worden. Er wordt echter geen time-out/error gegenereerd bij het uitvoeren van de "SELECT FOR UPDATE". VB blijft hier gewoon op hangen, totdat ik op PC1 het record weer vrijgeef.
Ik heb al verschillende dingen als de "ConnectionTimeout" en de "CommandTimeout" properties gebruikt, maar zonder resultaat. Toen kwam ik erachter dat als ik gewoon met de command-line client van postgres een "SELECT" doe op een record dat in VB gelocked is, er ook geen foutmelding/timeout optreedt. Het programma wacht gewoon totdat de transactie voltooid is. Op zich kan dit best handig zijn, maar in mijn geval wil ik de gebruiker gewoon melden dat het record in gebruik is en dat ie het later nog maar eens moet proberen.
Iemand een idee hoe ik dit gedrag van postgres kan veranderen ? (zowel de admin- als de user manual van postgres boden geen soelaas)
SIZE does matter.
"You're go at throttle up!"