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

news/2024/7/8 2:14:42

本文是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)")
}


http://lihuaxi.xjx100.cn/news/235494.html

相关文章

【学习笔记73】设计模式

一、认识单利模式&#xff08;设计模式&#xff09; 设计模式&#xff1a;为了 实现某一类功能的一个简洁优化的写法 &#xff08;一&#xff09;单利模式 一个构造函数(类), 一生只能有一个实例化对象 &#xff08;二&#xff09;案例需求 一个构造函数, 在实例化对象时, 判…

jupyter notebook出现cannot import name 'create_prompt_application'问题(Died Kernel)

应该是在安装其它python第三方库时更新了prompt-toolkit版本&#xff0c;降级到下面的版本即可&#xff1a; sudo pip install prompt-toolkit1.0.15 转载于:https://www.cnblogs.com/darklights/p/10302706.html

Swift 中使用 SQLite——查询数据

本文主要介绍如何查询 SQLite 结果集&#xff0c;以及封装 SQLite 的操作方法。 准备测试代码 /// 从数据库中加载 person 数组 class func persons() -> [Person]? {// 1. 准备 SQLlet sql "SELECT id, name, age, height FROM T_Person;"// 2. 访问数据库// …

Eclipse创建web工程时,报错Dynamic Web Module 3.0 requires Java 1.6 or newer.

报错&#xff1a; 解决方案&#xff1a; 1.打开eclipse工具栏window->preferences 2.打开java->compiler 3.选择compiler compliance level在1.6以上版本&#xff08;此处选择1.8&#xff09; 4.点击apply and close保存修改&#xff0c;即可 转载于:https://www.cnblogs…

Django 图片上传upload_to路径指定失效的问题记录

为什么80%的码农都做不了架构师&#xff1f;>>> 初始方法一&#xff1a; 疑虑&#xff1a;model使用upload_to自定义路径方法失效&#xff0c;指定路径也失效。最后以Views中指定MEDIA_URL和MEDIA_ROOT做拼接&#xff0c;并且自行判断并建立文件夹&#xff0c;手动…

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

本文主要介绍在SQLite中修改数据、删除数据&#xff1a; 更新记录 /// 将当前对象信息更新到数据库 /// /// - returns: 是否成功 func updatePerson() -> Bool {guard let name name else {print("姓名不能为空")return false}if id < 0 {print("id 不…

Maven学习总结(八)——使用Maven构建多模块项目

2019独角兽企业重金招聘Python工程师标准>>> Maven学习总结(八)——使用Maven构建多模块项目 在平时的Javaweb项目开发中为了便于后期的维护&#xff0c;我们一般会进行分层开发&#xff0c;最常见的就是分为domain&#xff08;域模型层&#xff09;、dao&#xff0…

mariadb 内存占用优化

本文由云社区发表 作者&#xff1a;工程师小熊 摘要&#xff1a;我们在使用mariadb的时候发现有时候不能启动起来&#xff0c;在使用过程中mariadb占用的内存很大&#xff0c;在这里学习下mariadb与内存相关的配置项&#xff0c;对mariadb进行调优。 查询最高内存占用 使用以下…