On Wed, 2007-06-20 at 11:05 +0200, Andre du Plessis wrote:
> Sorry if I created any confusion there were some code that seemed to
> have called
> Sqlite_reset simultaneously from more than one thread, even though the
> statements were unique for each thread the call to the library was not
> locked. I know assumptions are bad but I thought that reset on a unique
> statement should not have to be locked and serialized, but now I think
> it might, so now every single call to the library gets locked in a
> critical section and it seems to work.
> 
> However finalize worked because it seems that finalize can be called
> without synchronizing.

I'm not sure I completely understand, but anyway... :)

sqlite3_finalize() sets the database handle error code (and does
some other stuff to the db handle internally too). So if you're 
calling sqlite3_finalize(), you have to make sure no other thread 
is messing with the database handle or any of it's statements.

Dan.



> -----Original Message-----
> From: Andre du Plessis [mailto:[EMAIL PROTECTED] 
> Sent: 19 June 2007 07:21 PM
> To: sqlite-users@sqlite.org
> Subject: [sqlite] More SQLite Misuse
> 
> DLL version
> 
>   Sqlite3.3.17
> 
>  
> 
> The os is windows
> 
>  
> 
> After the last query of sqlite3_step
> 
>  
> 
> I decided to so some more tests, with threads, if synchronized properly,
> it seems that you can use more than one thread without any problem as
> long as 
> 
> Sqlite3_finalize is called is this correct?
> 
>  
> 
> Please note that this is a very simple query being executed :  "select *
> from threads where id = 1"
> 
>  
> 
> Imagine in the following scenarios both threads are executing
> simultaneously and will lock on the global critical section (so they are
> synchronized)
> 
> Using the same DB handle.
> 
>  
> 
> Scenario 1
> 
>  
> 
> THREAD1                                                       THREAD2
> 
>  
> 
> LockGlobalCriticalSection
> LockGlobalCriticalSection
> 
> Sqlite3_prepare
> Sqlite3_prepare
> 
> Sqlite3_step
> Sqlite3_step    <--------------------   SQLITE_MISUSE: library routine
> called out of sequence here
> 
> Sqlite3_reset
> Sqlite3_reset 
> 
> UnLockGlobalCriticalSection
> UnLockGlobalCriticalSection
> 
>  
> 
> // The following code works fine though
> 
>  
> 
> THREAD1                                                       THREAD2
> 
>  
> 
> LockGlobalCriticalSection
> LockGlobalCriticalSection
> 
> Sqlite3_prepare
> Sqlite3_prepare
> 
> Sqlite3_step
> Sqlite3_step    
> 
> Sqlite3_finalize
> Sqlite3_finalize 
> 
> UnLockGlobalCriticalSection
> UnLockGlobalCriticalSection
> 
>  
> 
> 
> 
> If my tests are correct it is not possible to retain a prepared
> statement across threads. And has to be reprepared each time ??
> 
>  
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> -----------------------------------------------------------------------------
> To unsubscribe, send email to [EMAIL PROTECTED]
> -----------------------------------------------------------------------------
> 


-----------------------------------------------------------------------------
To unsubscribe, send email to [EMAIL PROTECTED]
-----------------------------------------------------------------------------

Reply via email to