Chuck, On 12. 5. 2015, at 23:09, Chuck Hill <ch...@gevityinc.com> wrote:
> You really do come up with the absolute best problems! :-) Well it's great if one's best in something, is it not? ;) > My guess is that somehow the database failed to record the update to the > sequence number. Every time you ran it after that, it generated the used one > and then failed. When you added logging, something that you added caused two > to get generated with the first not used. Then everything worked again. > > Except… sequences should be generated outside of the ACID transition so I > can’t see how this could happen once, let alone multiple times. If that indeed was the culprit, is there a way to prevent the same problem if it occurs again? Thanks, OC > On 2015-05-12, 1:56 PM, "OC" wrote: > > Hello there, > > my application, among others, generates and stores audit records. The > appropriate code is comparatively straightforward; it boils down to something > like > > === > ... ec might contain unsaved objects at this moment ... > DBAudit audit=new DBAudit() > ec.insertObject(audit) > audit.takeValuesFromDictionary(... couple of plain attributes ...) > for (;;) { // see below the specific situation which causes a retry > try { > ec.saveChanges() > } catch (exception) { > // EC might contain an object which needs a sequentially numbered > attribute > // it should be reliable through all instances > // there is a DB unique constraint to ensure that > // the constraint exception is detected and served essentially this way: > if (exceptionIsNotUniqueConstraint(exception)) throw exception > SomeClass culprit=findTheObjectWhichCausedTheUniqueException(ec,exception) > culprit.theSequentialNumber++ > // and try again... > } > } > === > > It might be somewhat convoluted way to solve that (though I am afraid I can't > see any easier), but it worked for many months, about a zillion times without > the exception, sometimes with the exception and retry, always without the > slightest glitch. > > Then it so happened that > > - the EC indeed did contain an object with wrong (already occupied) > sequential number > - a DBAudit with PK=1015164 was inserted > - first time saveChanges did throw and the transaction was rolled back; the > second time (with incremented sequential number) it saved all right. > > So far so good, this did happen before often and never led to problems. > > This time though it did. The next time the above code was performed (no > sequentials, just the audit), the newly created audit was assigned _again_ > PK=1015164! Of course it failed. Well, we thought, perhaps there's some ugly > mess inside the EO stack; let's restart the application! > > After restart, the very first time the above code was called -- which is > pretty soon -- it happened again: regardless there was properly saved row > with PK=1015164 in the DB, EOF again assigned the same PK to the newly > created EO. I've tried it about five times (at first I did not believe my > eyes), it behaved consistently: restart, first time a DBAudit is created, it > gets PK=1015164 and saving (naturally) fails. > > Then I've prepared a version with extended logs; for start, I've simply added > a log of audit.permanentGlobalID() just before saveChanges. > > It worked without a glitch, assigning (and logging) PK=1015165, and > (naturally) saving without a problem. > > I have immediately stopped the app, returned to the original version -- the > one which used to consistently fail -- and from that moment on, it worked all > right too, assigning PK=1015166, and then PK=1015167, and so forth, as it > should. Without a need to log audit.permanentGlobalID() first. > > Well. Gremlins? > > Might perhaps anyone have the slightest glitch of an idea what the b. h. > might have been the culprit, and how to prevent the problem to occur again in > the future? > > Thanks a lot, > OC > > > _______________________________________________ > Do not post admin requests to the list. They will be ignored. > Webobjects-dev mailing list (Webobjects-dev@lists.apple.com) > Help/Unsubscribe/Update your Subscription: > https://lists.apple.com/mailman/options/webobjects-dev/chill%40gevityinc.com > > This email sent to ch...@gevityinc.com _______________________________________________ Do not post admin requests to the list. They will be ignored. Webobjects-dev mailing list (Webobjects-dev@lists.apple.com) Help/Unsubscribe/Update your Subscription: https://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com