fmdb中databasequeue的使用,避免死锁

简介: 在ios开发中,大家很可能会用到这样一个数据库封装:fmdb. 该封装相比coredata来说有他自己的优势:接口清晰,设计简单,符合规范,多线程情况下使用databasequeue来进行操作也很方便,还可以在其基础上再进行一些封装来方便项目的使用。

在ios开发中,大家很可能会用到这样一个数据库封装:fmdb.

该封装相比coredata来说有他自己的优势:接口清晰,设计简单,符合规范,多线程情况下使用databasequeue来进行操作也很方便,还可以在其基础上再进行一些封装来方便项目的使用。


正是因为fmdb的简单性,所以很容易被误用。在我们的项目开发中就遇到了一例(我们项目中的代码进行了封装,我这里将其还原,写示例来作说明):


 
  1. [queue inTransaction:^(FMDatabase *db, BOOL *rollback) {    
  2.             [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:1]];    
  3.             [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:2]];    
  4.             [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:3]];  
  5.     [
    queue
    inDatabase:^(FMDatabase *db) {
            // do work B
        }];

  6.  
  7.             if (whoopsSomethingWrongHappened) {    
  8.                     *rollback = YES; return;    
  9.             }   
  10.             // etc…    
  11.             [db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:4]];    
  12.     }];  

注意第6行往下,是不是混入了什么奇怪的东西?

从这里看起来问题非常明显了,但实际项目中接口被进行了一些封装,所以很难一眼看出问题,这里的问题是这样的:

在queue的事务内部又嵌套使用了该queue去执行任务b,而作为一个串行化的队列来说必须要等该事务整个执行完毕才能执行任务b;此时任务b无法走下去,该事务也就无法执行完毕,导致了死锁。

用一个比喻来说这个问题:一个人出门把门锁上了,然后把钥匙从门缝又塞回到家里,这样他就无法再进入家门了。

这个误用其实很低级,而且从原理上讲任何串行队列里面串行任务嵌套执行都有问题。


另外,fmdb的官方文档也多次提醒避免嵌套使用,请大家写代码的时候一定要注意~





目录
相关文章
|
机器学习/深度学习
【机器学习】凸函数判定
【1月更文挑战第23天】【机器学习】凸函数判定
|
数据库 数据安全/隐私保护
共享锁和排他锁在实际应用中的优缺点
【10月更文挑战第16天】共享锁和排他锁是多进程和多线程环境中常用的同步机制,它们各自具有优点和缺点。在实际应用中,需要根据具体的场景和需求选择合适的锁类型。在选择锁时,需要考虑读写比例、数据一致性要求、系统性能、死锁风险等因素,并结合实际情况进行优化和调整。通过合理使用锁,可以提高系统的并发性、数据一致性和性能。
|
域名解析 缓存 网络协议
如何解决域名解析不生效问题?
文中对域名解析不生效的原因进行了分析,并针对最常见的本地递归域名服务器缓存不生效的问题提出了解决方案,尤其移动域名解析HTTPDNS对无线场景下的应用特别有效。
32643 0
|
SQL 存储 关系型数据库
MySQL数据库——锁-表级锁(表锁、元数据锁、意向锁)
MySQL数据库——锁-表级锁(表锁、元数据锁、意向锁)
873 0
|
小程序 数据安全/隐私保护 开发者
如何免费制作微信小程序?详细步骤
如何免费制作微信小程序?详细步骤
如何免费制作微信小程序?详细步骤
|
缓存 负载均衡 安全
即时通讯安全篇(十):IM聊天系统安全手段之通信连接层加密技术
本篇文章将围绕IM通信连接层的安全问题及实现方案,聚焦IM网络“链路安全”,希望能带给你启发。
756 0
即时通讯安全篇(十):IM聊天系统安全手段之通信连接层加密技术
|
安全 数据挖掘 数据安全/隐私保护
新一代蓝牙5.3到底有哪些新东西
2021年7月,蓝牙官方组织SIG释放了代码Syndney的5.3版本蓝牙核心协议文档,此版本仍在第5个大版本中,属于小功能升级,那这个版本带来了哪些功能升级呢?
新一代蓝牙5.3到底有哪些新东西
|
监控 Linux
zabbix主动模式与被动模式区别以及详细配置(二十一)
zabbix主动模式与被动模式 1.zabbix主被动模式介绍 被动模式:被动模式就是由zabbix server向zabbix ag
701 0
zabbix主动模式与被动模式区别以及详细配置(二十一)
|
存储 弹性计算 运维
【云栖号案例 | 制造】振华重工通过ESSD助力核心ERP系统部署 实现数字化转型
振华重工数字化转型无从下手,对HANA吞吐量、数据保护、安全等保要求高,希望减少成本。上云后性能是业界同类产品的7~10倍,充分加速业务上云。