>> Another option is to start IMMEDIATE transaction in the second process
>> to avoid this course of action altogether.
>
>  Yes.  That won't fix the issue (you'll still get contention issues
>  that will require restarting the transaction) but they'll show up
>  at the beginning of the transaction, rather than the end.

And because they happen at the beginning of transaction one can deal
with that with a simple statement retry just like Mikolaj deals with
SQLITE_BUSY after a single INSERT in the first process I guess. So he
won't see it as "transaction restarts" in this case, just statement
retries. That's why it can be seen as fixing the issue.


Pavel


On Wed, Mar 7, 2012 at 12:28 PM, Jay A. Kreibich <j...@kreibi.ch> wrote:
> On Wed, Mar 07, 2012 at 08:41:17AM -0500, Pavel Ivanov scratched on the wall:
>> First your second process gets a SHARED lock on the database to read
>> it, then your first process gets RESERVED lock on the database to
>> indicate that it will change it. Then your second process tries to
>> promote its SHARED lock to RESERVED one, sees that RESERVED lock has
>> been already taken and can't proceed (returns SQLITE_BUSY). At this
>> point first process can't commit its transaction because there's
>> SHARED lock on it and second process can't proceed with its
>> transaction because there's RESERVED lock on it. To continue you have
>> to rollback transaction in the second process and start it over again.
>
>  The SQLite docs explain a bit of what is going on here:
>
>    http://sqlite.org/c3ref/busy_handler.html
>
>  As Pavel says, sooner or later one of the connections needs to give
>  up and issue a ROLLBACK to kill the transaction and break the
>  deadlock.
>
>  "Using SQLite" spends several pages on this issue, as it is rather
>  non-obvious to someone that hasn't messed with SQLite quite a bit.
>
>> Another option is to start IMMEDIATE transaction in the second process
>> to avoid this course of action altogether.
>
>  Yes.  That won't fix the issue (you'll still get contention issues
>  that will require restarting the transaction) but they'll show up
>  at the beginning of the transaction, rather than the end.
>
>   -j
>
>
>
>
>> 2012/3/7 Miko??aj Radwan <mikolaj.rad...@coretechnology.pl>:
>> > Hi all,
>> >
>> > For a couple days now I've been trying to figure out this problem and
>> > can't seem to manage.
>> >
>> > I have two processes, both of which connect to the same SQLite database
>> > and do the following:
>> >
>> > process 1:
>> >
>> > # opens database
>> > PRAGMA foreign_keys = ON;
>> > PRAGMA journal_mode = PERSIST;
>> > INSERT INTO sometable (somecolumns) VALUES (somevalues);
>> > # closes database
>> >
>> > process 2:
>> >
>> > # opens database
>> > PRAGMA foreign_keys = ON;
>> > PRAGMA journal_mode = PERSIST;
>> > BEGIN DEFERRED TRANSACTION;
>> > SELECT somecolumns FROM sometable WHERE someconditions;
>> > DELETE FROM sometable WHERE someconditions;
>> > COMMIT TRANSACTION;
>> > # closes database
>> >
>> > After a couple iterations both processes start getting the "database
>> > locked" error and never work again unless one of them is killed.
>> >
>> > The funny thing is that I tested this on two configurations. One is a
>> > 32-bit Debian box with libsqlite-dev 3.7.3-1 installed. The other is a
>> > 64-bit Gentoo box with sqlite 3.7.7.1. The problem only arises on the
>> > first one. When I noticed it I looked through the version history but
>> > have not seen any mention of a bug like that being solved.
>> >
>> > Any ideas?
>> >
>> > Thanks in advance,
>> > Mikolaj
>> > _______________________________________________
>> > sqlite-users mailing list
>> > sqlite-users@sqlite.org
>> > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>> _______________________________________________
>> sqlite-users mailing list
>> sqlite-users@sqlite.org
>> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
>
> --
> Jay A. Kreibich < J A Y  @  K R E I B I.C H >
>
> "Intelligence is like underwear: it is important that you have it,
>  but showing it to the wrong people has the tendency to make them
>  feel uncomfortable." -- Angela Johnson
> _______________________________________________
> sqlite-users mailing list
> sqlite-users@sqlite.org
> http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to