本文是Swift 中使用 SQLite系列的收官之作,介绍一下在数据库中的批量更新。

事务

  • 在准备做大规模数据操作前,首先开启一个事务,保存操作前的数据库的状态
  • 开始数据操作
  • 如果数据操作成功,提交事务,让数据库更新到数据操作后的状态
  • 如果数据操作失败,回滚事务,让数据库还原到操作前的状态

准备事务代码

// MARK: - 事务处理
/// 开启事务
func beginTransaction() {sqlite3_exec(db, "BEGIN TRANSACTION;", nil, nil, nil)
}/// 提交事务
func commitTransaction() {sqlite3_exec(db, "COMMIT TRANSACTION;", nil, nil, nil)
}/// 回滚事务
func rollbackTransaction() {sqlite3_exec(db, "ROLLBACK TRANSACTION;", nil, nil, nil)
}

用事务插入大量数据

  • 不使用事务插入数据
/// 不使用事务插入多条记录 - 测试记录 5s
private func manyPerson1() {print("start")let start = CACurrentMediaTime()for i in 0..<10000 {Person(dict: ["name": "zhang - \(i)", "age": 18, "height": 1.7]).insertPerson()}print("over \(CACurrentMediaTime() - start)")
}
  • 使用事务插入数据
/// 使用事务插入多条数据 - 测试记录 0.4s
private func manyPerson2() {print("start")let start = CACurrentMediaTime()SQLiteManager.sharedManager.execSQL("BEGIN TRANSACTION;")for i in 0..<10000 {Person(dict: ["name": "zhang - \(i)", "age": 18, "height": 1.7]).insertPerson()}SQLiteManager.sharedManager.execSQL("COMMIT TRANSACTION;")print("over \(CACurrentMediaTime() - start)")
}

原因:在 SQLite 中,如果不主动开启事务,每个数据更新操作 (INSERT / UPDATE / DELETE) 都会默认开启一个事务,数据更新结束后自动提交事务

  • 模拟失败
/// 模拟失败
private func manyPerson3() {print("start")let start = CACurrentMediaTime()SQLiteManager.sharedManager.execSQL("BEGIN TRANSACTION;")for i in 0..<10000 {Person(dict: ["name": "zhang - \(i)", "age": 18, "height": 1.7]).insertPerson()if i == 1000 {SQLiteManager.sharedManager.execSQL("ROLLBACK TRANSACTION;")// 注意:一定要使用 break 退出循环break;}}SQLiteManager.sharedManager.execSQL("COMMIT TRANSACTION;")print("over \(CACurrentMediaTime() - start)")
}
  • 标准写法
/// 标准写法
private func manyPerson4() {print("start")let start = CACurrentMediaTime()SQLiteManager.sharedManager.execSQL("BEGIN TRANSACTION;")for i in 0..<10000 {if !Person(dict: ["name": "zhang - \(i)", "age": 18, "height": 1.7]).insertPerson() {SQLiteManager.sharedManager.execSQL("ROLLBACK TRANSACTION;")break;}}SQLiteManager.sharedManager.execSQL("COMMIT TRANSACTION;")print("over \(CACurrentMediaTime() - start)")
}

Swift 中使用 SQLite——批量更新(事务处理)相关推荐

  1. Swift 中使用 SQLite——打开数据库

    关于Swift中使用SQLite,接下来可能会分别从打开.增.删.改.查,几个方面来介绍SQLite的具体使用,这一篇重点介绍一下如何打开. 定义全局数据库访问句柄 /// 全局数据库访问句柄 pri ...

  2. mysql begin end 批量更新_MySql中4种批量更新的方法

    1.replace into 批量更新 replace into test_tbl (id,dr) values (1,'2'),(2,'3'),...(x,'y');例: replace into ...

  3. MySql中4种批量更新的方法

    最近在完成MySql项目集成的情况下,需要增加批量更新的功能,根据网上的资料整理了一下,很好用,都测试过,可以直接使用. mysql 批量更新共有以下四种办法 1..replace into 批量更新 ...

  4. mysql update批量更新_MySql中4种批量更新的方法

    mysql 批量更新共有以下四种办法 1..replace into 批量更新 replace into test_tbl (id,dr) values (1,'2'),(2,'3'),...(x,' ...

  5. Swift 中使用 SQLite——修改和删除数据

    本文主要介绍在SQLite中修改数据.删除数据: 更新记录 /// 将当前对象信息更新到数据库 /// /// - returns: 是否成功 func updatePerson() -> Bo ...

  6. Swift 中使用 SQLite——新增数据

    本文重点介绍两个方面,1.新增数据,2.获取自动增长 ID. 建立 Person.swift 数据模型 /// 个人模型 class Person: NSObject {// MARK: - 模型属性 ...

  7. Swift 中使用 SQLite——查询数据

    本文主要介绍如何查询 SQLite 结果集,以及封装 SQLite 的操作方法. 准备测试代码 /// 从数据库中加载 person 数组 class func persons() -> [Pe ...

  8. ABP 在 EntityFramework 中使用扩展批量更新时的异常

    报错信息:Invalid Cast. The update expression must be of type MemberInitExpression. 直译结果:无效的.更新表达式必须是Memb ...

  9. 批量更新日期字段中的年

    工作需要,将数据中的日期字段中的年批量更新到指定的年,想了一下,写成这样: 如:批量更新到DateAdd(year,-5,GETDATE()) =2002 SET oDateTime=DateAdd( ...

最新文章

  1. 一次完整的抓包分析 Reserved TCP/IP Port List
  2. 我又发现了7款特别好用的神仙软件,让人心动!
  3. java datetime int_关于jodatime:Java中DateTime对象之间的小数天数
  4. 车辆贷款违约预测挑战赛
  5. 处理网络故障常用的命令
  6. [ NOI 2002 ] Robot
  7. undefined control sequence_GeForce NOW在KDDI的帮助下提供服务:《Control》加入游戏库
  8. MySQL删除s表命令_SQLServer数据库sql语句中----删除表数据drop、truncate和delete的用法...
  9. Centos7 中文乱码切换中英字符
  10. 杭电oj 1001 c++版本
  11. [转]asp 无法连接 access,出现 -2147467259 未指定的错误
  12. 苹果Mac侧边栏笔记工具:​​​​​​​​SideNotes
  13. windows10 安装 rancher desktop及测试案例
  14. 咖啡html代码,咖啡.html
  15. MIKE 21 教程 1.7 网格生成过程中的常见报错与问题
  16. spring的几种注入方式
  17. java常用的接口和类的说明,Java程序连接数据库的常用的类和接口介绍
  18. TDengine助力京东云IoT数据统计改造
  19. 架构师:说一说什么是面向对象?
  20. 合工大 程序设计艺术 实验三 房间最短路径

热门文章

  1. 对话框窗口最大最小化
  2. linux下使用NetBeans调试libevent库
  3. C++11中std::unique_lock的使用
  4. C++中try/catch/throw的使用
  5. windows7 64位操作系统上使vs2010和vs2013能够并存的处理方法
  6. 【Qt】Qt再学习(十四):QGraphicsView
  7. 获取人口_Human Terrain——世界人口三维可视化
  8. mybatis mysql 配置文件_Mybatis配置文件详解(4)
  9. php字符串定义为arraylist,如何把arraylist集合中的字符串数据保存的文本文件中
  10. solr 实现对经纬度的查询