146 字
1 分钟
FMDB-死锁问题
2020-10-13
2026-10-12
[queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
            [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:1]];
            [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:2]];
            [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:3]];
    [queue inDatabase:^(FMDatabase *db) {
        // do work B
    }];
            if (whoopsSomethingWrongHappened) {
                    *rollback = YES; return;
            }
            // etc…
            [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:4]];
    }];
  • 使用fmdb进行数据库操作,出现inDatabase: was called reentrantly on the same queue, which would lead to a deadlock这样的崩溃错误.原因是在一个[queue inDataBase]的block中,又执行了一个inDataBase.这时第一个block需要执行结束才能出队列,第二个block才能执行.但是第一个block又包含了第二个block,也就是说第二个block不执行,第一个block就不能结束.于是就互相等待,也就是各种死锁