> what is interesting is that proc B's 'item not found in locker!' is a read 
> operation.  so possibly i've (inadvertently) hit the 'shared lock upgrade to 
> reserved lock' immediate fail.
>
> thoughts?

Did you reset/finalize statement after this read operation? Do you
have any other active (not reset/finalized) select statements in the
same connection in proc B when you try to begin immediate transaction?


Pavel

On Mon, Nov 23, 2009 at 2:28 PM, Tom Broadbent
<tom.broadb...@plasticlogic.com> wrote:
> thanks for the interesting comments.  here is the log that (i believe) 
> illustrates the problem:
>
> 092250 PID:07E50002 TID:07E60002 PLFS!INFO: attempting to begin IMMEDIATE 
> transaction
> 092260 PID:04310006 TID:0548000E PLFS!INFO: item not found in locker!
> 092267 PID:04310006 TID:0548000E PLFS!INFO: attempting to begin IMMEDIATE 
> transaction
> 092284 PID:07E50002 TID:07E60002 PLFS!INFO: attempting to end transaction
> 092391 PID:04310006 TID:0548000E PLFS!ERROR: [SQLite] 
> PLFS::PLFSProxy::BeginTransaction: Error 5; (.\PLFSProxy.cpp)
> 092399 PID:04310006 TID:0548000E PLFS!ERROR: 
> PLFS::PLFSProxy::BeginTransaction: Error 205 [PLFS_ERROR_DB_LOCK_FAILED]; 
> (.\PLFSProxy.cpp:3364)
> 092412 PID:04310006 TID:0548000E PLFS!ERROR: PLFS::PLFSProxy::DeleteId: Error 
> 205 [PLFS_ERROR_DB_LOCK_FAILED]; (.\PLFSProxy.cpp:2025)
> 092424 PID:04310006 TID:0548000E PLFS!ERROR: 
> PLFS::BnLockerProxy::SyncPlfsToLocker: Error 205 [PLFS_ERROR_DB_LOCK_FAILED]; 
> (.\PLFSBnLockerManager.cpp:272
>
> what this shows (to me) is that proc A (07E50002) got the IMMEDIATE 
> transaction and proc B (04310006) failed to get an IMMEDIATE transaction.
>
> what is interesting is that proc B's 'item not found in locker!' is a read 
> operation.  so possibly i've (inadvertently) hit the 'shared lock upgrade to 
> reserved lock' immediate fail.
>
> thoughts?
>
> thanks
> tom
>
> -----Original Message-----
> From: sqlite-users-boun...@sqlite.org 
> [mailto:sqlite-users-boun...@sqlite.org] On Behalf Of Pavel Ivanov
> Sent: Monday, November 23, 2009 7:36 AM
> To: General Discussion of SQLite Database
> Subject: Re: [sqlite] begin transaction
>
>> That's true, but the comment is a bit deceptive, In this
>> particular case SQLite is supposed to invoke the busy-handler. What
>> should happen is that SQLite grabs the SHARED lock then fails to get
>> the RESERVED. But in this case SQLite is smart enough to know that
>> it can release the SHARED lock, invoke the busy-handler, then try
>> again.
>
> I'm glad it is so.
> BTW, this special case (with your great examples) as long as all cases
> when busy handler is invoked/not invoked are better to be mentioned
> somewhere in here http://www.sqlite.org/lockingv3.html or here
> http://www.sqlite.org/c3ref/busy_handler.html.
>
> Pavel
>
> On Mon, Nov 23, 2009 at 10:17 AM, Dan Kennedy <danielk1...@gmail.com> wrote:
>>
>> On Nov 23, 2009, at 9:26 PM, Pavel Ivanov wrote:
>>
>>> According to SQLite sources:
>>>
>>> ** The pager invokes the busy-handler if sqlite3OsLock() returns
>>> ** SQLITE_BUSY when trying to upgrade from no-lock to a SHARED lock,
>>> ** or when trying to upgrade from a RESERVED lock to an EXCLUSIVE
>>> ** lock. It does *not* invoke the busy handler when upgrading from
>>> ** SHARED to RESERVED, or when upgrading from SHARED to EXCLUSIVE
>>> ** (which occurs during hot-journal rollback). Summary:
>>> **
>>> **   Transition                        | Invokes xBusyHandler
>>> **   --------------------------------------------------------
>>> **   NO_LOCK       -> SHARED_LOCK      | Yes
>>> **   SHARED_LOCK   -> RESERVED_LOCK    | No
>>> **   SHARED_LOCK   -> EXCLUSIVE_LOCK   | No
>>> **   RESERVED_LOCK -> EXCLUSIVE_LOCK   | Yes
>>>
>>>
>>> When you issue BEGIN IMMEDIATE statement SQLite has first obtain
>>> SHARED lock and right after that RESERVED lock too.
>>
>> That's true, but the comment is a bit deceptive, In this
>> particular case SQLite is supposed to invoke the busy-handler. What
>> should happen is that SQLite grabs the SHARED lock then fails to get
>> the RESERVED. But in this case SQLite is smart enough to know that
>> it can release the SHARED lock, invoke the busy-handler, then try
>> again. This is different from the situation where the connection
>> already has a SHARED lock and tries to upgrade to reserved after
>> the user has read from the db.
>>
>> For example, assuming that some other process has a RESERVED lock
>> on our file:
>>
>>   INSERT INTO ...             /* busy-handler invoked */
>>
>>   BEGIN IMMEDIATE;            /* busy-handler invoked */
>>
>>   BEGIN;
>>   INSERT INTO ...             /* busy-handler invoked */
>>
>> but if we try:
>>
>>   BEGIN;
>>   SELECT * FROM ...           /* Grab SHARED lock */
>>   INSERT INTO ...             /* Immediate SQLITE_BUSY */
>>
>> The last case is different as SQLite cannot release the SHARED lock
>> before calling the busy-handler (doing so might mean the transaction
>> does not appear isolated to the user). So it cannot call the
>> busy-handler without risking deadlock. Return immediately instead.
>>
>> I'm not sure why the OP's call is returning immediately without calling
>> the busy-handler.
>>
>> Dan.
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>> In your, Tom,
>>> situation obtaining of the SHARED lock will succeed right away unless
>>> proc A has already written something to disk but RESERVED lock will
>>> fail and no busy handler is called here.
>>>
>>> Besides that I cannot say what thoughts are behind this design
>>> solution.
>>>
>>>
>>> Pavel
>>>
>>> On Mon, Nov 23, 2009 at 9:15 AM, O'Neill, Owen <oone...@averyberkel.com
>>> > wrote:
>>>>
>>>>
>>>> Hi Tom,
>>>>
>>>> Whilst not knowing much about the process, I have a recollection
>>>> about
>>>> something in the documentation that said if sqlite thought that there
>>>> was a potential for deadlock the busy handler was never even called.
>>>>
>>>> Could that explain this ?
>>>>
>>>> Cheers
>>>> Owen
>>>>
>>>>
>>>>
>>>> -----Original Message-----
>>>> From: sqlite-users-boun...@sqlite.org
>>>> [mailto:sqlite-users-boun...@sqlite.org] On Behalf Of Tom Broadbent
>>>> Sent: Friday, November 20, 2009 7:27 PM
>>>> To: sqlite-users@sqlite.org
>>>> Subject: [sqlite] begin transaction
>>>>
>>>> i have several processes all trying to write to a given DB.  i have
>>>> set
>>>> sqlite3_busy_timeout to 10000 (10 sec).  when proc A successfully
>>>> beings
>>>> a trasaction IMMEDIATE what appears to happen when proc B attempts to
>>>> begin transaction IMMEDIATE is that it fails immediately w/
>>>> SQLITE_BUSY.
>>>> i would expect that proc B would wait 10 sec trying to begin
>>>> transaction
>>>> rather than fail immediately.
>>>>
>>>> is this expected?
>>>>
>>>> thanks
>>>> tom
>>>>
>>>> ______________________________________________________________________
>>>> This email has been scanned by the MessageLabs Email Security System.
>>>> For more information please visit http://www.messagelabs.com/email
>>>> ______________________________________________________________________
>>>> _______________________________________________
>>>> 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
>
> ______________________________________________________________________
> This email has been scanned by the MessageLabs Email Security System.
> For more information please visit http://www.messagelabs.com/email
> ______________________________________________________________________
>
> ______________________________________________________________________
> This email has been scanned by the MessageLabs Email Security System.
> For more information please visit http://www.messagelabs.com/email
> ______________________________________________________________________
> _______________________________________________
> 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