[progress Communities] [progress Openedge Abl] Forum Post: Re: -rereadnolock For Oepas

  • Thread starter mroberts@rev.com.au
  • Start date
Status
Not open for further replies.
M

mroberts@rev.com.au

Guest
Hi James, Thanks for the insight. Yes, we use ROWID ... and closer look at the docs have exposed a hole in my knowledge that I had not noticed since -rereadnolock had been introduced. Our legacy code does not rely on recid-rowid much, so adding -rereadnolock fixed a lot of problems, and we have relied upon it since then. We made the assumption that -rereadnolock worked as it implied, as we had not been bitten by this feature. When you have a large code base that uses rowid-recid sparingly, and lots of users hitting multiple appserver agents randomly to get records, and only some of them using rowid-recid with no lock, then the chances of getting "dirty" data is slim. But as the light dawns in our brains this morning, we realise that this has been a low level issue in our app over years, and might explain the occasional unusual issue where the app behaves strangely because the job was cancelled, and the user still managed to update it, because an unfortunate no-lock read by rowid got old data, on an appserver agent that still had the record in the buffer. On moving to PAS, and a web interface, we are using a new framework that relies on ROWID a lot, and with 1 user using the PAS agent, and other users still using the legacy appserver code (with classic appserver), we find the issue jumps out at us ... records are being updated in the classic appserver legacy code and not being reflected in the FIND that is passing data to our web framework. I like your choice of words "unless that is fixed in 11.7.1" ... my expectation has always been that with -rereadnolock, ANY FIND will ALWAYS read the DB. My guess is no, but I would be happy to know if this feature was seen as a bug and had a plan to be fixed. Looks like a job ahead putting an extra FIND CURRENT in code wherever it may appear, but having the following retrofitted everywhere FND record WHERE ROWID(record) = rRowID NO-LOCK NO-ERROR. IF AVAILABLE record THEN DO: FIND CURRENT record NO-LOCK NO-ERROR,. END. Seems counter intuitive to me Mark

Continue reading...
 
Status
Not open for further replies.
Top