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] -----------------------------------------------------------------------------