数据库只有在事务中才能被修改。 所有更改数据库的SQL命令(除SELECT以外的所有SQL命令)都会自动开启一个新的事务,并且当最后一个查询完成时自动提交。
threadsafe就是指在设置正确的前提下,多线程同时访问SQLite并不会影响数据库的完整性,而不是说每个线程对数据库所有的操作都可以保证正确执行!!!经过实际测试我才意识到这个问题。
不论是设置成SQLITE_CONFIG_SERIALIZED还是SQLITE_CONFIG_MULTITHREAD,多个线程(每个线程使用一个数据库连接)执行的时候,三个步骤(prepare_v2、step、finalize)都会出现SQLITE_BUSY(5)的错误。 虽然,不会影响数据库中的数据完整性, 但是,一旦在程序中操作失败,而我们又没有检查返回值,直接会影响程序逻辑的正确性(简单说,本意为会插入的数据并没有插进数据库)。 所以,显然不可以直接让多线程去操作数据库。
解决方法:
1.在每个线程操作数据库时,手动加锁
2.形成一个操作队列,统一去操作数据库