0

我有一个项目,我应该使用多个表来避免在我的 sqlite 文件中保留重复的数据(即使我知道使用多个表是一场噩梦)。

在我的应用程序中,我正在以某种方法从一个表中读取数据,并以某种其他方法将数据插入到另一个表中。当我这样做时,我从 sqlite step 函数中得到错误代码 21,这是 sqlite 误用。

根据我的研究,那是因为我无法从多线程访问表。

到目前为止,我阅读了 sqlite 网站并了解到配置 sqlite 数据库有 3 种模式:

1)单线程:你没有机会调用多个线程。
2)多线程:是的多线程;但也有一些障碍。
3)序列化:这是与多线程数据库应用程序的最佳匹配。

如果sqlite3_threadsafe() == 2 返回 true 那么是的,您的 sqlite 数据库已序列化,并且返回 true,所以我为自己证明了这一点。

然后我有一个代码来配置我的 sqlite 数据库以进行序列化以保证它。

sqlite3_config(SQLITE_CONFIG_SERIALIZED);

当我在课堂上使用上面的代码时,我从 1 个表中读取和插入数据可以完美地工作:)。但是,如果我尝试在课堂上使用它,我从 2 个表中读取和插入数据(实际上是我真正需要它的地方),就会出现 sqlite 滥用问题。

我检查了我打开和关闭数据库的代码,它们没有问题。他们工作,除非我删除另一个。

我正在使用 ios5,这对我的项目来说确实是一个大问题。我听说instagram 使用postgresql 可能是这个原因哈?你一开始会建议 postgresql 还是 sqlite ?

4

1 回答 1

2

在我看来,你把两件事搞混了。

单线程与多线程

单线程构建只能在代码的一个线程中安全使用,因为它们在内部缺少允许多个线程安全使用的机制(互斥体、临界区等)。如果您使用多线程,请使用多线程构建(或期待“有趣”的麻烦;您已被警告过)。

SQLite 的线程支持非常简单。对于多线程构建,特定的连接只能从单个线程中使用(除非它们最初可以在另一个线程中打开)。

所有最近(最近几年?)的 SQLite 构建都对从多个进程访问单个数据库感到满意,但并行度取决于……</p>

交易类型

SQL 通常支持多种类型的事务。SQLite 只支持其中的一个子集,并且它的默认值是 SERIALIZABLE。这是最安全的访问方式;它模拟了如果一次只能发生一件事,您会看到什么。(在内部,它是使用一种方案实现的,该方案允许许多读者同时进入,但只有一个作者;有一些巧妙的方法可以防止任何人挨饿。)

SQLite 还支持读取未提交的事务。这增加了可用于代码的并行性数量,但存在读者看到尚未保证持续存在的信息的风险。这对您是否重要取决于您的应用程序。

于 2012-02-26T16:53:40.953 回答