In een multi user/multi threaded omgeving wil ik in een Oracle database een bepaald record locken zodat andere users/threads deze niet kunnen bereiken.
De tabel waar het over gaat is een queue waar een aantal pending opdrachten in staan. Een van de kolommen in die tabel is het aantal pogingen dat er zijn gebeurd om de opdracht uit te voeren.
De opdracht kan falen omdat er data ontbreekt, en in dat geval werkt het perfect, maar het kan ook gebeuren dat de opdracht langer dan 5 minuten duurt. In dat geval verliest de applicatie zijn connectie met de database en worden alle wijzigingen gerollbackt.
Vermits dit ook als een poging moet tellen wil ik dus
1) lock op de table zetten
2) het aantal pogingen met 1 verhogen
3) die verhoging al committen zonder mijn lock te verliezen
4) opdracht uitvoeren
5) volledige commit + unlock.
Alleen, bij een commit wordt er automatisch geunlocked en ben ik dus mijn garantie kwijt dat andere threads deze data niet locken voor hun gebruik.
Zelf had ik al gedacht om de tabel uit te bereiden met een "in-use" flag of een andere manier die de status van het record bijhoudt, maar het zou beter zijn indien ik het op een nettere manier kan oplossen.
SQL:
1
| select column_names from table_name where conditions for update nowait |
De tabel waar het over gaat is een queue waar een aantal pending opdrachten in staan. Een van de kolommen in die tabel is het aantal pogingen dat er zijn gebeurd om de opdracht uit te voeren.
De opdracht kan falen omdat er data ontbreekt, en in dat geval werkt het perfect, maar het kan ook gebeuren dat de opdracht langer dan 5 minuten duurt. In dat geval verliest de applicatie zijn connectie met de database en worden alle wijzigingen gerollbackt.
Vermits dit ook als een poging moet tellen wil ik dus
1) lock op de table zetten
2) het aantal pogingen met 1 verhogen
3) die verhoging al committen zonder mijn lock te verliezen
4) opdracht uitvoeren
5) volledige commit + unlock.
Alleen, bij een commit wordt er automatisch geunlocked en ben ik dus mijn garantie kwijt dat andere threads deze data niet locken voor hun gebruik.
Zelf had ik al gedacht om de tabel uit te bereiden met een "in-use" flag of een andere manier die de status van het record bijhoudt, maar het zou beter zijn indien ik het op een nettere manier kan oplossen.
When you talk to God it's called prayer, but when God talks to you it's called schizophrenia