Hi,
I am getting a table lock for no apparent reason in my application.
To reproduce this I have written a test file that behaves the same way with
the difference that it reports database lock instead of table lock. My
application database is in memory the test uses a file database. I think it
is the same locking issue.
Attached is "test.c"
gcc -Wall test.c -lsqlite3 -o test
run two test at the same time you will see the problem.
Thanks,
-Alex
// gcc -Wall test.c -lsqlite3
#include <pthread.h>
#include <sqlite3.h>
#include <assert.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
sqlite3* gdb;
int ass(int a, int b)
{
if(a != b)
{
printf("Expected %d Got %d\n", a, b);
printf("%s\n", sqlite3_errmsg(gdb));
return 0;
}
return 1;
}
#define MAX_LOOP 10000
#define MAX_THREAD 1
void xTrace(void* self, const char* zSql)
{
printf(" %d %s\n", (int) self, zSql);
}
void init_trace(void* self)
{
sqlite3_trace(gdb, xTrace, self);
}
void* test(void* val)
{
int i, id = (int)val;
for(i = 0 ; i < MAX_LOOP ; i++)
{
char* zSql;
sqlite3_stmt* stmt;
char* tbl = sqlite3_mprintf("tbl_%d_%d", getpid(), id);
zSql = sqlite3_mprintf("create table %s(a)", tbl);
assert(ass(SQLITE_OK, sqlite3_prepare_v2(gdb, zSql, -1, &stmt, 0)));
assert(ass(SQLITE_DONE, sqlite3_step(stmt)));
assert(ass(SQLITE_OK, sqlite3_finalize(stmt)));
sqlite3_free(zSql);
//printf("create stmt %p\n", stmt);
zSql = sqlite3_mprintf("insert into %s values(77777)", tbl);
assert(ass(SQLITE_OK, sqlite3_prepare_v2(gdb, zSql, -1, &stmt, 0)));
assert(ass(SQLITE_DONE, sqlite3_step(stmt)));
assert(ass(SQLITE_OK, sqlite3_finalize(stmt)));
sqlite3_free(zSql);
//printf("insert stmt %p\n", stmt);
zSql = sqlite3_mprintf("drop table %s", tbl);
assert(ass(SQLITE_OK, sqlite3_prepare_v2(gdb, zSql, -1, &stmt, 0)));
assert(ass(SQLITE_DONE, sqlite3_step(stmt)));
assert(ass(SQLITE_OK, sqlite3_finalize(stmt)));
sqlite3_free(zSql);
//printf("drop stmt %p\n", stmt);
//zSql = sqlite3_mprintf("select tbl_name from sqlite_master where
tbl_name=%Q", tbl);
//assert(ass(SQLITE_OK, sqlite3_prepare_v2(gdb, zSql, -1, &stmt, 0)));
//assert(ass(SQLITE_DONE, sqlite3_step(stmt)));
//assert(ass(SQLITE_OK, sqlite3_finalize(stmt)));
//sqlite3_free(zSql);
//printf("select stmt %p\n", stmt);
sqlite3_free(tbl);
}
return 0;
}
int main()
{
char* file = "test.db";
//char* file = "/dev/shm/test.db";
assert(ass(SQLITE_OK, sqlite3_open(file, &gdb)));
init_trace(0);
int i;
pthread_t threads[MAX_THREAD];
for(i = 0 ; i < MAX_THREAD ; i++)
{
assert(pthread_create(&threads[i], 0, test, (void*) i) == 0);
}
for(i = 0 ; i < MAX_THREAD ; i++)
{
assert(pthread_join(threads[i], 0) == 0);
}
sqlite3_stmt *pStmt;
while( (pStmt = sqlite3_next_stmt(gdb, 0))!=0 )
{
static int count = 0;
printf("%d: next %p\n", count++, pStmt);
sqlite3_finalize(pStmt);
}
assert(ass(SQLITE_OK, sqlite3_close(gdb)));
return 0;
}
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users