On Mon, Oct 19, 2009 at 12:13 PM, Keith Roberts <ke...@karsites.net> wrote: > On Mon, 19 Oct 2009, P Kishor wrote: > >> To: General Discussion of SQLite Database <sqlite-users@sqlite.org> >> From: P Kishor <punk.k...@gmail.com> >> 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. > > What about dumping the onblur event and using a seperate graphical check > button for the user to send the SELECT query. > > So the user has to click the graphical button to send the SELECT query, > using the onclick event?
Yes, that is the "Patient: 'Doctor, it hurts when I press here;' Doctor: 'So, don't press there'" strategy. May have to resort to that. > > Kind Regards, > > Keith Roberts > > > > > > > > >> 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