首页 > 解决方案 > 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())

标签: c++ioscswiftsqlite

解决方案


推荐阅读