为什么以下代码不起作用:
#include <stdio.h> #include <sqlite3.h> int main(void) { sqlite3 *pDb; sqlite3_stmt *stmt; char *errmsg; sqlite3_open(":memory:",&pDb); sqlite3_exec(pDb,"CREATE TABLE Test(a INTEGER)",NULL,NULL); sqlite3_exec(pDb,"INSERT INTO Test(a) VALUES(1)",NULL); sqlite3_prepare_v2(pDb,"SELECT * FROM Test",-1,&stmt,NULL); sqlite3_step(stmt); sqlite3_exec(pDb,"ATTACH 'Test.db' as Other;",NULL); sqlite3_exec(pDb,"DETACH Other;",&errmsg); printf("error: %s\n",errmsg); return 0; }
输出:
error: database Other is locked
解决方法
transaction documentation说:
An implicit transaction (a transaction that is started automatically,not a transaction started by BEGIN) is committed automatically when the last active statement finishes. A statement finishes when its prepared statement is 07001 or 07002.
事务始终为affect all attached databases,因此打开的事务将锁定所有数据库.