In our application we have two threads implementing a signal logger
functionality, see pseudo code below.
Thread 1: Reads signal data, and log to a global in-memory SQLite database
after a pre-determined number of reads.
1 while( true )
2 {
3 // Buffer data, blocks until new data is available
4 buffer.append( readData() )
5 ++numberOfReads;
6
7 if ( numberOfReads == maxReads )
8 {
9 globalTransactionMutex.request()
10
11 begin transaction
12 insert bufferered data to "main" in GlobalDbConnection
13 commit transaction
14
15 globalTransactionMutex.release()
16 numberOfReads = 0;
17 }
18 }
Thread 2: Upon user action, transfer data within a specified time window from
the in-memory database to a database file
19 while( true )
20 {
21 waitForUserAction()
22
23 DestDbConnection = Create destination database file Dest.db
24 close DestDbConnection
25
26 attach Dest.db with GlobalDbConnection as "Dest"
27 transfer log data from "main" to "Dest" in GlobalDbConnection using
INSERT INTO Dest SELECT FROM main
28
29 globalTransactionMutex.request()
30 detach "Dest" from GlobalDbConnection
31 globalTransactionMutex.release()
32 }
Attaching the destination database Dest.db and transferring data (23)-(27) work
without any hassle.
The problem we're facing is that the detach statement (30) fails with error
message "SQL Logic error or missing database".
The transaction is protected with a mutex, so it should not be possible to
execute the detach statement (30) during an ongoing transaction. Moreover, both
threads have the same priority, so we don't have any dead-lock issues.
The code in Thread 2 (19) -(32) seems to work fine in a single threaded unit
test. We're using SQLite v. 3.6.21 on Windows XP.
Does anyone have any idea about the source of this problem? Have we missed
something regarding SQLite and multi-threading?
Regards,
Pontus Bergsten
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users