On 6/18/15, Harmen de Jong - CoachR Group B.V. <harmen at coachr.com> wrote:
> A SELECT query obtains a SHARED lock on the database file. Doing so, there
> can be many simultaneous readers according to the documentation at
> https://www.sqlite.org/lockingv3.html. However, before the SHARED lock is
> obtained in winLock(sqlite3_file *id, int locktype), a temporary PENDING
> lock is requested.
>
> So when multiple threads start a SELECT query on different sqlite3* objects
> at the exact same time, some of them will result in a SQLITE_BUSY error,
> because they all request the exclusive PENDING lock. Is there a way to work
> around this, so that I can execute SELECT queries really simultaneously?
>
> We have WAL enabled,

Please double-check that you really have WAL mode enabled.  From the
sqlite3.exe command-line shell run commands like:

     PRAGMA journal_mode;
     .dbinfo

In the second command, the "write format" and "read format" should both be "2".

I do not think you are really in WAL mode because a SHARED lock should
never happen in WAL mode.



> so we were under the assumption that it should be
> possible to have multiple readers at the same time, however the UNLOCKED ->
> PENDING -> SHARED transition seems to intervene with the principle of having
> multiple readers at the same time.
>
> This is the callstack of one of the threads:
>
>>             SQLService.exe!winLock(sqlite3_file * id=0x0e42aab0, int
>> locktype=1) Line 35956
>                SQLService.exe!sqlite3OsLock(sqlite3_file * id=0x0e42aab0,
> int lockType=1) Line 16294
>                SQLService.exe!pagerLockDb(Pager * pPager=0x0e42a998, int
> eLock=1) Line 42356
>                SQLService.exe!pager_wait_on_lock(Pager * pPager=0x0e42a998,
> int locktype=1) Line 45027
>                SQLService.exe!sqlite3PagerSharedLock(Pager *
> pPager=0x0e42a998) Line 46249
>                SQLService.exe!lockBtree(BtShared * pBt=0x0e429ea0) Line
> 55204
>                SQLService.exe!sqlite3BtreeBeginTrans(Btree * p=0x0e428250,
> int wrflag=0) Line 55562
>                SQLService.exe!sqlite3InitOne(sqlite3 * db=0x0e427e38, int
> iDb=0, char * * pzErrMsg=0x0d861654) Line 104635
>                SQLService.exe!sqlite3Init(sqlite3 * db=0x0e427e38, char * *
> pzErrMsg=0x0d861654) Line 104814
>                SQLService.exe!sqlite3ReadSchema(Parse * pParse=0x0d861650)
> Line 104851
>                SQLService.exe!sqlite3LocateTable(Parse * pParse=0x0d861650,
> int isView=0, const char * zName=0x0dd4ad38, const char * zDbase=0x00000000)
> Line 90098
>                SQLService.exe!sqlite3LocateTableItem(Parse *
> pParse=0x0d861650, int isView=0, SrcList_item * p=0x0dd4adc0) Line 90143
>                SQLService.exe!selectExpander(Walker * pWalker=0x0cd6ec58,
> Select * p=0x0dd4acb8) Line 109480
>                SQLService.exe!sqlite3WalkSelect(Walker * pWalker=0x0cd6ec58,
> Select * p=0x0dd4acb8) Line 80316
>                SQLService.exe!sqlite3SelectExpand(Parse * pParse=0x0d861650,
> Select * pSelect=0x0dd4acb8) Line 109726
>                SQLService.exe!sqlite3SelectPrep(Parse * pParse=0x0d861650,
> Select * p=0x0dd4acb8, NameContext * pOuterNC=0x00000000) Line 109812
>                SQLService.exe!sqlite3Select(Parse * pParse=0x0d861650,
> Select * p=0x0dd4acb8, SelectDest * pDest=0x0cd6ef70) Line 110055
>                SQLService.exe!yy_reduce(yyParser * yypParser=0x0d8665c0, int
> yyruleno=111) Line 124055
>                SQLService.exe!sqlite3Parser(void * yyp=0x0d8665c0, int
> yymajor=1, Token yyminor={...}, Parse * pParse=0x0d861650) Line 125147
>                SQLService.exe!sqlite3RunParser(Parse * pParse=0x0d861650,
> const char * zSql=0x0141a4c4, char * * pzErrMsg=0x0cd6f09c) Line 125987
>                SQLService.exe!sqlite3Prepare(sqlite3 * db=0x0e427e38, const
> char * zSql=0x0141a4c4, int nBytes=-1, int saveSqlFlag=1, Vdbe *
> pReprepare=0x00000000, sqlite3_stmt * * ppStmt=0x0cd6f138, const char * *
> pzTail=0x0cd6f144) Line 105039
>                SQLService.exe!sqlite3LockAndPrepare(sqlite3 * db=0x0e427e38,
> const char * zSql=0x0141a4c4, int nBytes=-1, int saveSqlFlag=1, Vdbe *
> pOld=0x00000000, sqlite3_stmt * * ppStmt=0x0cd6f138, const char * *
> pzTail=0x0cd6f144) Line 105139
>                SQLService.exe!sqlite3_prepare_v2(sqlite3 * db=0x0e427e38,
> const char * zSql=0x0141a4c4, int nBytes=-1, sqlite3_stmt * *
> ppStmt=0x0cd6f138, const char * * pzTail=0x0cd6f144) Line 105215
>                SQLService.exe!sqlite3_exec(sqlite3 * db=0x0e427e38, const
> char * zSql=0x0141a4c4, int (void *, int, char * *, char * *) *
> xCallback=0x00000000, void * pArg=0x00000000, char * * pzErrMsg=0x00000000)
> Line 100638
>
> Best regards,
>
> Harmen de Jong
> CoachR Group B.V.
> _______________________________________________
> sqlite-users mailing list
> sqlite-users at mailinglists.sqlite.org
> http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users
>


-- 
D. Richard Hipp
drh at sqlite.org

Reply via email to