Your problem is not with threading, that seems to be working just fine,
it is with the way Sqlite works. Since it is a single file it locks the
entire file when you alter the DB so that only one thread/process can
change it at a time. You need to rethink your application in such a way
that you use the Sqlite busy logic or use your own synchronization using
a mutex or similar.
Use Sqlite as you would use shared access to a single file using file
locks and then you will reap the benefits of the ease of use and
simplicity of maintenance of Sqlite, otherwise you need to go to a more
complex DBMS.
JS
Silas Justiniano wrote:
Hello! I've downloaded sqlite-3_3_5-tea and compiled it correctly. It
generates libsqlite335.so perfectly, but there is a problem.
I compiled it with threads (I did ./configure --enable-thread and I
checked -DTHREAD_SAFE=1 in the Makefile) but I can't write to the same
database/table at the same time. I open a transaction in one thread
and do lots of sql inserctions, then I close. While there is an opened
transaction in one thread, I can't do (insert/update/delete) anything
in another thread. I get "database is locked". Any idea?
Here is the script I used to test:
# --- BEGIN
package require Thread
load ./libsqlite335.so
sqlite3 db db
db eval "DROP TABLE tabela;"
db eval "CREATE TABLE tabela(n integer);"
set thread_id [thread::create {
load libsqlite335.so
sqlite3 db db
set i 0
db eval "BEGIN DEFERRED TRANSACTION;"
while 1 {
db eval "INSERT INTO tabela VALUES($i);"
puts $i
incr i
}
db eval "COMMIT TRANSACTION;"
vwait forever
}]
set i 10000
while 1 {
db eval "INSERT INTO tabela VALUES($i);"
puts $i
incr i
}
# --- END
See I'm using the Thread extension and Tcl is "thread-compiled"(?).
Any clue?
Thank you! Bye!