c++ - sqlite上的读写锁
问题描述
问题已经很清楚了,标记为不清楚的人需要先去弄清楚他的理解。褒贬不一的人都明白了。
任何熟悉使用给定 sqlite 构造的读写锁(互斥锁)或基本上处理读/写并发或竞争条件的高级 Sqlite 专业人士。
我也标记了 C,因为它是 Swift + C 代码的混合体。
是否有这样的结构可以让读取同时发生,但在写入发生时锁定所有读取线程。(当然,iOS 提供了一些结构,如串行队列等,但我对 sqlite 提供的实用程序感兴趣)
在以下示例中,我有一个读取和一个写入操作。
问:如何在两个读写操作之间实现并发,以便读取可以同时发生,并在写入时被阻塞,并等待写入完成。
var database: OpaquePointer! // DI populates database connection
// read operation
func getDepartments() throws -> [Department]? {
sqlite3_mutex_enter(sqlite3_db_mutex(database))
var statement: OpaquePointer? = nil
let sql = "SELECT * FROM department"
guard sqlite3_prepare_v2(database, sql, -1, &statement, nil) == SQLITE_OK else {
throw NSError(domain: String(cString: sqlite3_errmsg(database)), code: 1, userInfo: nil)
}
defer {
sqlite3_finalize(statement)
sqlite3_mutex_leave(sqlite3_db_mutex(database))
}
var departments: [Department] = []
while sqlite3_step(statement) == SQLITE_ROW {
departments.append(Department(id: sqlite3_column_int64(statement, 0), name: String(cString: sqlite3_column_text(statement, 1))))
}
return departments
}
// write operation, needs lock
func delete(_ id: Int32) throws -> Int32? {
let sql = "DELETE FROM department WHERE id = \(id)"
guard sqlite3_exec(database, sql, nil, nil, nil) == SQLITE_OK else {
throw NSError(domain: String(cString: sqlite3_errmsg(database)), code: 2, userInfo: nil)
}
return sqlite3_changes(database)
}
这将返回 2 ->print(sqlite3_threadsafe())
解决方案
推荐阅读
- java - 为 Stripe Api 创建客户
- r - 仅绘制特定轴文本标签
- flutter - 如何在颤动中使画布的角落变圆
- jestjs - 如何在 handleTestEvent 函数或 afterEach 块中访问 Jest 测试状态(失败或通过)?
- python - vmcloak 安装后失败,语法无效
- swift - 如何在 SwiftUI 中使用 VideoPlayer() 全屏显示?
- javascript - Odoo 13 Enterprise SaaS,我可以编辑产品搜索模块以仅使用 JavaScript 搜索产品描述吗?
- selenium - Selenium Python 从表格行中获取数据
- python - Flask 访问 json 数据并将其嵌入到标签中
- javascript - 汇总没有特定键名的数据