当前位置: 首页 > 知识库问答 >
问题:

SQLite3和释放锁

裘兴思
2023-03-14

SQLite具有不同级别的锁:UNLOCKEDSHAREDRESERVEDPENDINGEXCLUSIVE

我找不到调用SQLite API获取和释放锁定的信息。

据我所知,调用sqlite3\U步骤时获得锁。锁的类型取决于预处理语句的表达式。此外,此命令还可以升级自定义事务内的锁定写入操作。

据我所知,写入锁也是由sqlite3\u步骤释放的-此函数返回SQLITE\u DONE或错误代码。我没有找到任何文档,但该函数应该在执行结束时释放保留的待处理的独占的。

但是我不明白读取操作会发生什么。要获取所有查询的行,我们需要多次调用sqlite3_step-每次调用都会给我们一行。

我从Unlock notify API中找到了关于操作系统缓存和引用的SQLite文档:一次调用sqlite3\u step()返回SQLite\u行,然后下一个SQLite\u锁定是不可能的

我假设在读取操作中,首先调用sqlite3_step获取SHAREDlock并将数据从文件加载到操作系统缓存。如果sqlite3_step返回除SQLITE_ROW之外的任何内容(即SQLITE_DONE或错误代码),则释放锁。

是这样吗?

我们如何手动释放获取的锁进行读取操作?sqlite3_reset


共有1个答案

左丘凡
2023-03-14

SQLite在sqlite3\u prepare中获取对数据库/表的锁定,并在sqlite3\u finalize中释放它。锁的类型取决于SQL表达式。

因此,如果您创建了一个STMT-您需要尽快执行它并完成。否则您会阻止不同的连接。

示例:如果您为SELECT表达式创建了STMT-您获得了SHARED锁。因此,在STMT完成之前,来自不同连接的所有写入操作都将被阻止。

 类似资料:
  • 问题内容: 我应该在将分配的字符串传递给之后释放它吗? 我有一些类似的代码: 在将字符串传递给之后释放字符串时,出现错误。如果我删除呼叫,该错误消失。我究竟做错了什么? 我看到矛盾的意见。有人说我应该自己释放它,有人说VM释放它,有人说VM不释放它,而您应该用奇怪的巫术魔术来释放它。我很困惑。 问题答案: 参数to 的存储完全由您负责:如果您分配了,则需要它。因此,您发布的代码段是正确的。您正在其

  • 问题内容: 我有一个使用“线程”模块的Python程序。每秒一次,我的程序启动一个新线程,该线程从Web上获取一些数据,并将这些数据存储到我的硬盘中。我想使用sqlite3来存储这些结果,但是我无法使其正常工作。问题似乎与以下几行有关: 如果将这行代码放入每个线程中,则会收到OperationalError通知我数据库文件已锁定。我猜这意味着另一个线程通过sqlite3连接打开了mydatabas

  • export class SearchService { ... .map((response) => response.json()) .catch((e) => { if (e.status >== 500) { return cachedVersion(); new Error(`${ e.status

  • 因此,我知道对堆栈中分配的变量调用会导致无效指针错误。 在ED指针中,在实际指针之前分配8个字节,以保留关于指针大小的信息。因此,我想知道是否在一个结构之前做了一个,然后在该结构上调用free,是否可以释放该结构(当然,这偏离了分配这8个字节是所做的唯一额外的事情的假设)。 我想我的最后一个问题是,堆栈变量分配和堆分配之间是否有真正的区别(就后端对内核的调用而言)。

  • sqlite3pp 该库对SQLite3 API使用C++类进行包装,支持几乎所有SQLite3功能(打开数据库、查询、执行命令、事物等)。 示例代码如下: database 数据库 sqlite3pp::database db("test.db");db.execute("INSERT INTO contacts (name, phone) VALUES ('Mike', '555-1234')

  • 我正在学习Android和目前的回收器视图,所以在这个例子中,我在单击播放按钮时播放特定的原始声音文件,然后在完成后释放它。我可以认真地使用一些关于最佳实践的指针,但是因为我有一些问题和疑问: 我有一个过渡状态的问题,所以如果我按播放非常快,我会得到一个IllegalStateException,可能是因为试图释放一个已经发布的播放器。 显然,我也应该在发布后nullify并在之前进行null检查