Conclusion: onblur() is an error prone strategy. I am going to look into changing my approach that doesn't involve onblur().
I will research into busy_timeout() settings that might contribute to more reliability from the point of view of sqlite. Thanks you all who helped out. On Mon, Oct 19, 2009 at 12:45 PM, Clark Christensen <cdcmi...@yahoo.com> wrote: >>But, if I enter something in the field, and, instead of tabbing out of >>it, if I click on the submit button, two events fire simultaneously. >>There is the onblur() from the field (this is a SELECT query), and the >>submit from the form (this is an UPDATE/INSERT query). The events >>reach sqlite simultaneously, and it croaks. > > I seem to remember Javascript offers no guarantee about which event fires > first. It's browser-dependent. So I think, as you originally indicated, > this is to be avoided. > > Perhaps onBlur isn't the best event to listen for. Maybe an onFocus handler > on the second field, would be more appropriate. > > >>Mind it, I am not talking about Amazon.com here. But, even with a few >>hundred users, someone is likely to hit the db at the same time >>someone else is hitting it. How do you all manage this situation? > > I see the more knowledgeable among us have weighed-in. For my $0.02, I'd say > make sure the busy_timeout is set appropriately. Also, I have the impression > (on Windows, anyway), localhost seems more prone to this than a remote Apache > box. ISTR you're a Mac user, so none of this may apply :-)) > > > > > ----- Original Message ---- > From: P Kishor <punk.k...@gmail.com> > To: General Discussion of SQLite Database <sqlite-users@sqlite.org> > Sent: Mon, October 19, 2009 9:44:39 AM > Subject: Re: [sqlite] suggestions for avoiding "database locked" on ajax > > Let me shed a bit more light on this (as I have understood). Top > posting follows -- > > What is happening is that I have an onblur() action on a field which > sends off a request to check the validity of the entered text. Then, > of course, I have the submit button which also sends off the entire > form to the server for more work. If a user (me, when testing the > darned thing) tabs away from the field with onblur(), all is well. The > onblur() fires, the request is sent to the server, sqlite responds, > all is well in the 20 acre woods. > > But, if I enter something in the field, and, instead of tabbing out of > it, if I click on the submit button, two events fire simultaneously. > There is the onblur() from the field (this is a SELECT query), and the > submit from the form (this is an UPDATE/INSERT query). The events > reach sqlite simultaneously, and it croaks. > > Now, here is the question -- in real life, the web server would > receive many concurrent requests, not just the one described above. > What happens in that case? If there is an UPDATE/INSERT request while > a SELECT is happens to be happening, there is going to be a block, no? > Putting logic in my code to keep retrying till a query (SELECT or > UPDATE/INSERT) succeeds is going to be very messy. Does this make > sqlite unsuitable for a web application? > > Mind it, I am not talking about Amazon.com here. But, even with a few > hundred users, someone is likely to hit the db at the same time > someone else is hitting it. How do you all manage this situation? > > > > On Sun, Oct 18, 2009 at 2:28 PM, Clark Christensen <cdcmi...@yahoo.com> wrote: >>>Ajax is always asynchronous. That is what the first "A" in Ajax is. >> >> Well, not quite always. The open() method of the XMLHttpRequest object lets >> you specify syncronous, or async. But, since you're using jQuery's >> wrappers, it's async. Good choice. Love jQuery. >> >>>I am not doing $dbh->disconnect. DBI is supposed to that automatically >>>when the script finishes. Don't have any issues other than during >>>these Ajax calls. >> >> I agree. It should. But I wonder if it takes more time for the forked Perl >> process to clean-up and close than you're expecting. I never did figure out >> the exact cause and effect. I just $dbh->disconnect (before printing the >> response where appropriate) and the issue usually seems to resolve itself. >> >> >> >>>I don't have any timeout set at all. Roger Binns suggestion a >>>busy_timeout, but I am not sure how to even use that. I am using DBI. >>>Where do I set sqlite busy_timeout? Besides, how would that help me? >> >> If you're currently set to a short value, lengthening it might help >> narrow-down the real culprit (or prove a timing issue). >> >> DBD-SQLite adds this driver private method >> >> $dbh->func( 'busy_timeout' ); # getter >> $dbh->func( $ms, 'busy_timeout' ); # setter >> >> I seem to think it defaults to 30 seconds, but I don't see it documented now. >> >> If you move the second AJAX request from the onBlur event, to an >> explicit user click (button, link, etc), do you still get the locked >> DB? If not, I think it would help prove it's a timing issue (or not). >> >> >> >> ----- Original Message ---- >> From: P Kishor <punk.k...@gmail.com> >> To: General Discussion of SQLite Database <sqlite-users@sqlite.org> >> Sent: Sat, October 17, 2009 8:07:09 PM >> Subject: Re: [sqlite] suggestions for avoiding "database locked" on ajax >> >> On Sat, Oct 17, 2009 at 7:16 PM, Clark Christensen <cdcmi...@yahoo.com> >> wrote: >>> Sorry for top-posting... >>> >>> What's running on the the server? A Perl CGI script? Apache HTTPD? >>> mod-perl? >> >> Although I have Apache mod_perl installed, I am running a plain >> vanilla Perl cgi script for now. >> >>> >>> Is the AJAX exchange asyncronous? >> >> Ajax is always asynchronous. That is what the first "A" in Ajax is. >> >>> Are you sure the first AJAX exchange is finished when the second one fires? >> >> Am I sure? Not really. I guess it is not finished when the second one >> fires, which is what causes the database lock, no? >> >>> Does the AJAX request wait for a 200 response? >> >> I am using jQuery. It does what it does. I don't do anything special. >> >>> >>> Assuming Perl, are you explicitly closing the DB with $dbh->disconnect (as >>> opposed to $dbh = undef)? Does the script end with an exit instruction? >> >> I am not doing $dbh->disconnect. DBI is supposed to that automatically >> when the script finishes. Don't have any issues other than during >> these Ajax calls. >> >>> I'm guessing you're sure there's no writer or writers that jumped-in. >> >> I am sure no other process is interfering other than what I have >> specified. I am sure because I am the only one using my laptop on >> which I am doing the development. :-) >> >> >>> Are you doing anything like modifying the default 30 second busy_timeout? >>> Perhaps to too short a timeout? >> >> I don't have any timeout set at all. Roger Binns suggestion a >> busy_timeout, but I am not sure how to even use that. I am using DBI. >> Where do I set sqlite busy_timeout? Besides, how would that help me? >> >>> >>> Sometimes it's useful to $dbh->disconnect before you print the response. >>> >>> I've seen this happen from time to time in my own environment. It's >>> annoying as hell. It seems to always come down to when and how I >>> disconnect from the DB file. >>> >>> I seldom see it in regular CGI scripts. More often, I see it with >>> mod_perl::PerlRun (I don't use mod_perl::Registry) when I open the $dbh in >>> a module where $dbh is exported into the main package. >> >> No, as I described, what I think is happening is that two Ajax events >> are hitting the db at the nearly the same time. The first one is a >> select (checking the db if the user exists), and the second is an >> insert (creating a user because the user didn't exist). Even though >> Javascript has gotten the response from the first event, and started >> on the second process. sqlite is still busy from the first process, so >> throws a lockout. >> >> Yes, it is very annoying. I have to figure out some other shenanigans >> to prevent this from happening. >> >>> >>> -Clark >>> >>> >>> >>> ----- Original Message ---- >>> From: P Kishor <punk.k...@gmail.com> >>> To: General Discussion of SQLite Database <sqlite-users@sqlite.org> >>> Sent: Fri, October 16, 2009 12:53:28 PM >>> Subject: [sqlite] suggestions for avoiding "database locked" on ajax >>> >>> Yes, I know, if it "hurts when I press here," then I shouldn't "press >>> here," but, so it goes... >>> >>> I have an account creation form -- users enter their email and their >>> desired username, and the form -- >>> >>> onblur from the username field, sends off an ajax request to see if >>> the desired username already exists in the db, and if yes, it sends >>> back a suggestion; >>> >>> onblur from the email field, sends off an ajax request to see if the >>> email already exists in the db, and if yes... >>> >>> If neither the username nor the email exist in the db, then the >>> application creates a record and informs the user of success. Except, >>> the previous ajax request (I am assuming it is the previous ajax >>> request from onblur event from the email field) has locked the >>> database, and the app returns an error that "the database is locked." >>> >>> So, what suggestion might you all have for getting around this? >>> >>> >>> >>> -- >>> Puneet Kishor http://www.punkish.org >>> Carbon Model http://carbonmodel.org >>> Charter Member, Open Source Geospatial Foundation http://www.osgeo.org >>> Science Commons Fellow, http://sciencecommons.org/about/whoweare/kishor >>> Nelson Institute, UW-Madison http://www.nelson.wisc.edu >>> ----------------------------------------------------------------------- >>> Assertions are politics; backing up assertions with evidence is science >>> ======================================================================= >>> Sent from Madison, WI, United States _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users