> Humm.  Resetting each prepared statement right after use seemed to work.  So 
> in review, a select prepared statement will lock the DB from other threads 
> (or is it DB connections?) but not the current thread (or is it DB 
> connection).

Yes, you are right. Transactions and database locks are
per-connection. So if you work with only one connection (even sharing
it between different threads) and not resetting your statements it
means that all your application works in a one huge transaction,
committing everything at the end (I guess if you hard kill your
application in the middle you'll see that nothing was committed to the
database). And if you work with several different connections (no
matter in different threads or in a single thread) they will block
each other, i.e. if you execute writing transaction in one connection
you won't be able to write in a second connection and sometimes you
won't even able to read in a second connection.

And answering your question from another email: you can step through
any number of prepared statements simultaneously as long as they are
all created from the same connection. They won't block each other from
executing. You just can't call sqlite3_step() on one connection
simultaneously in several threads - they will be serialized. Other
than that you are free to step through any number of select statements
and execute updates in parallel. But there's one rule of thumb to
remember: never change data that should be returned in some active
select statement. You can get very surprising behavior in this case.


Pavel


On Thu, May 12, 2011 at 8:33 PM, John Deal <bassd...@yahoo.com> wrote:
> Hello Pavel,
>
> Humm.  Resetting each prepared statement right after use seemed to work.  So 
> in review, a select prepared statement will lock the DB from other threads 
> (or is it DB connections?) but not the current thread (or is it DB 
> connection).
>
> Thanks for the help!
>
> John
>
> --- On Thu, 5/12/11, Pavel Ivanov <paiva...@gmail.com> wrote:
>
>> From: Pavel Ivanov <paiva...@gmail.com>
>> Subject: Re: [sqlite] Common Multi-treaded Problem
>> To: "General Discussion of SQLite Database" <sqlite-users@sqlite.org>
>> Date: Thursday, May 12, 2011, 5:58 PM
>> > Interesting is the impression I
>> had with prepared statements was the reset was only
>> necessary if you wanted to reuse that statement.  Since
>> each each DB connection is in its own instance of a class
>> (with it own set of prepared statements) I would not think
>> there would be any dependency on different physical prepared
>> statements on different threads.  I would expect this with
>> incomplete transactions.
>>
>> There's no dependency between different prepared
>> statements, but there
>> is dependency between transactions as they use the same
>> database. And
>> transaction cannot be finished (implicitly or explicitly)
>> until all
>> statements in this transaction are reset or finalized.
>>
>>
>> Pavel
>>
>>
>> On Thu, May 12, 2011 at 4:01 PM, John Deal <bassd...@yahoo.com>
>> wrote:
>> > Hello Igor,
>> >
>> > That very well maybe it.  I am not at home so can't
>> test for sure but I reset the prepared statements right
>> before I use them so they are left hanging if another thread
>> came in.
>> >
>> > Interesting is the impression I had with prepared
>> statements was the reset was only necessary if you wanted to
>> reuse that statement.  Since each each DB connection is in
>> its own instance of a class (with it own set of prepared
>> statements) I would not think there would be any dependency
>> on different physical prepared statements on different
>> threads.  I would expect this with incomplete
>> transactions.
>> >
>> > Anyway, thanks for the insight.
>> >
>> > John
>> >
>> > --- On Thu, 5/12/11, Igor Tandetnik <itandet...@mvps.org>
>> wrote:
>> >
>> >> From: Igor Tandetnik <itandet...@mvps.org>
>> >> Subject: Re: [sqlite] Common Multi-treaded
>> Problem
>> >> To: sqlite-users@sqlite.org
>> >> Date: Thursday, May 12, 2011, 12:35 PM
>> >> On 5/12/2011 12:31 PM, John Deal
>> >> wrote:
>> >> > When I allow multiple readers with each
>> thread using a
>> >> different DB
>> >> > connection (open with the same flags) and
>> each thread
>> >> having
>> >> > exclusive use of its DB connection (no
>> sharing of
>> >> connections) and if
>> >> > more than one thread is reading the DB at the
>> same
>> >> time, the DB
>> >> > becomes locked for writing even when all the
>> reads are
>> >> finished.
>> >>
>> >> My first inclination would be to look for places
>> where you
>> >> leak active
>> >> statement handles, by failing to reset or
>> finalize
>> >> statements. The read
>> >> operation is not really finished until the
>> statement is
>> >> reset/finalized.
>> >> --
>> >> Igor Tandetnik
>> >>
>> >> _______________________________________________
>> >> 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
>> >
>> _______________________________________________
>> 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
>
_______________________________________________
sqlite-users mailing list
sqlite-users@sqlite.org
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to