Problem is trying to get a shared lock in sqlite.c, "static int
winLock(sqlite3_file *id, int locktype)"
at line 37428:
while( cnt-->0 && (res = winLockFile(&pFile->h, SQLITE_LOCKFILE_FLAGS,
PENDING_BYTE, 0, 1, 0))==0 ){
cnt = 2
locktype = 1 //SHARED_LOCK
lastErrno = 6 //ERROR_INVALID_HANDLE
Thoughts?
On 11/3/2015 6:12 PM, Jim Morris wrote:
> 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
>
>
>
> _______________________________________________
> sqlite-users mailing list
> sqlite-users at mailinglists.sqlite.org
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users