Guillaume Fougnies wrote:
Wed, Sep 14, 2005 at 11:43:43PM +0200: Rolf Schaeuble wrote:


Dennis Jenkins wrote:

Rolf Schaeuble wrote:


Hello,

if I understand the whole issue correctly, there is only one reason why it's not safe to use a sqlite handle in any thread of a process (as long as only one thread at a time uses it): File locks are tied to the thread that created them (except this special Redhat version). That's why on Windows everything's safe, since file locks are per-process there.

If that's correct, couldn't this problem be solved by letting sqlite use a dedicated thread to do the locking? Each time a lock needed to be set/removed, a message would be sent to that thread which then would perform the locking. That should make it safe to use the sqlite*

from any thread.

For single threaded applications that would mean more thread switching. For multithreaded applications, however, life wouldn't only become easier, but performance may well increase. In my applications I have a dedicated database access thread. Each time a query needs to be executed, it's sent to this thread. In this case I have thread switching anyway. Only having it when a lock is set/removed will decrease the amount of switches.

Best regards
Rolf Schäuble



I disagree with the entire approach.  It seems hackish.

Just have each thread create it's own sqlite handle. So long as one thread does not need to "pass off" an exisiting handle to a different thread you will be fine.

That doesn't work for me. During one single transaction several threads need to insert data into the db; due to this transaction, all threads have to share a single database handle.


No.
Each thread needs to open its own db handle and let SQLite make
the lock job. That's all.

Well, don't take that "share" literally. Only the dedicated thread actually issues commands. But I can only have one single database handle, since my scenario looks like this:
- Start (exclusive) transaction.
- Several threads produce data to be written into the database
- Commit/rollback transaction.

The database is locked during the transaction, so the threads can't open their own handle and use that.



Since you don't need a db handle opened by thread(a) to be used
by another thread (b), you won't have any problem...
If you need to, you will need my "lost patch" :)

http://www.sqlite.org/cvstrac/tktview?tn=1417
Well, I need, but this patch doesn't help. I would get SQLITE_BUSY all the time while the transaction is running.

In my opinion the whole problem is that threads can't override locks of other threads. Letting a dedicated thread do the locking would kind of allow this. Besides making the usage of sqlite easier, it would also result in the same behaviour as on the Windows platform.

Reply via email to