I have a connection used by the main (UI) thread and recently added a 
background thread, with own connection(no shared cache) to upload 
changes to server on Windows Mobile 6.0/6.5 devices and upgraded to 
SQLite 3.9.2.  The background thread is getting an error 10, extended 
error 3850 as a result of a step when reading a result set in the 
background thread.  I'm unclear on the cause of this error.

Is this likely to be a logic error in my code?   E.g. locking, 
statements not reset, transactions open or an OS related issue on the 
device.  Possibly unrelated, as I recall we needed to go to journal mode 
"PERSIST" years ago to resolve an OS NVFS issue.  Most of the reads are 
not in transactions and most of the writes are in transactions that are 
"BEGIN IMMEDIATE TRANSACTION".  Busy timeout is 30 seconds.

Anyone else still using Windows Mobile 6.x devices?

Is there a graceful work around?


      (3850) SQLITE_IOERR_LOCK

The SQLITE_IOERR_LOCK error code is an extended error code 
<https://www.sqlite.org/rescode.html#pve> for SQLITE_IOERR 
<https://www.sqlite.org/rescode.html#ioerr> indicating an I/O error in 
the advisory file locking logic. Usually an SQLITE_IOERR_LOCK error 
indicates a problem obtaining a PENDING lock 
<https://www.sqlite.org/lockingv3.html#pending_lock>. However it can 
also indicate miscellaneous locking errors on some of the specialized 
VFSes <https://www.sqlite.org/vfs.html> used on Macs.

Thanks



On 11/3/2015 10:42 AM, R.Smith wrote:
>
>
> On 2015-11-03 06:31 PM, ALBERT Aur?lien wrote:
>> Hi,
>>
>> I'm often getting the "Database is locked" error message and I don't 
>> really understand what can lead to this.
>>
>> I'm using these settings :
>>    - sqlite3_config(SQLITE_CONFIG_MULTITHREAD)
>>    - multiple threads
>>    - only one sqlite connection per thread
>>    - each thread have a different connection instance
>>
>> Could anyone clarify some things for me ?
>>
>> 1/ Can different threads perform read at the same time (I think yes)
> Yes - at least, SQLite will handle the requests in a way that seems 
> simultaneous.
>
>> 2/ Can different threads perform write at the same time (I think no)
> Nothing can write simultaneously
>
>> 3/ Can a thread perform read while another single one is performing 
>> write ? (I think yes)
> Depends on the transaction and Journaling mode. See:
> https://www.sqlite.org/lockingv3.html#writing
> https://www.sqlite.org/lockingv3.html#rollback
> In fact, that entire page should be of interest to you.
>
> Also, WAL journal mode is inherently good at this. See:
> https://www.sqlite.org/wal.html#concurrency
>
>> 4/ Can a thread perform read while another thread has started a 
>> transaction ? (I think yes)
> Only if it isn't an exclusive transaction and has not started a write 
> operation, or WAL mode is used, or it is the same connection with 
> read_uncommitted turned on... actually, there are a lot of "if"s here.
>
> In general, it is best to view a "Transaction" as a locked state and 
> plan accordingly, and if you absolutely need to read simultaneously 
> from elsewhere, be prepared to take special steps in your code and 
> read up on the modes.
>
>> My "Database is locked" problem seems to only appears in situation 
>> number 4, may I am wrong on this one ? Maybe on others ?
>
> To put this shortly - you cannot do two things at the same time in a 
> database.
> Most contentions can be (and are) resolved internally with simple 
> rules, but as soon as a more prominent contention appears (and there 
> are many ways this could happen) then one reader/writer thread will 
> have to wait a little bit until a previous is finished. SQLite's 
> "timeout" setting (as mentioned and linked by Simon already) should 
> fix 99% of these without making you add any extra code.
>
> There may be one or two extreme cases or race conditions that requires 
> special consideration, but mostly setting the timeout should suffice. 
> If you still get locked problems - please post again.
>
> Cheers,
> Ryan
>
>
> _______________________________________________
> sqlite-users mailing list
> sqlite-users at mailinglists.sqlite.org
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to