SQLite 3 优化批量数据存储操作---事务transaction机制

0、事务操作

事务的目的是为了保证数据的一致性和完整性

事务(Transaction)具有以下四个标准属性,通常根据首字母缩写为 ACID:

  • 原子性(Atomicity):确保工作单位内的所有操作都成功完成,否则,事务会在出现故障时终止,之前的操作也会回滚到以前的状态。
  • 一致性(Consistency):确保数据库在成功提交的事务上正确地改变状态。
  • 隔离性(Isolation):使事务操作相互独立和透明。
  • 持久性(Durability):确保已提交事务的结果或效果在系统发生故障的情况下仍然存在。

开启事务操作相比不开启事务操作的优势

①、性能提升:可以避免频繁地访问磁盘,因为磁盘I/O操作比内存操作慢得多。将数据先写入缓存可以批量处理磁盘写入,减少磁盘I/O次数,从而提高效率。

②、事务管理:缓存机制有助于实现事务的回滚功能。如果事务执行过程中出现错误,可以轻松地从缓存中清除未提交的更改,而不必去磁盘上进行复杂的恢复操作。

③、持久化:当事务被提交时,缓存中的数据会被写入到数据库文件中,这个过程称为“刷盘”。这样做的目的是为了确保数据的持久性,即一旦事务提交,数据更改就成为永久的,即使系统崩溃,数据也不会丢失。

1、事务开始

事务可以是延迟的立即的独占的,默认事务行为是延迟的。

DEFERRED:直到第一次访问数据库时事务才真正开始。

IMMEDIATE:使数据库连接立即开始新的写入,而不等待写入语句。如果另一个写事务已经在另一个数据库连接上处于活动状态, BEGIN IMMEDIATE 可能会失败并返回SQLITE_BUSY

EXCLUSIVE:与 IMMEDIATE 类似,但是更加强制,等待所有读取和写入操作完成。

事务类型在BEGIN命令中指定:

BEGIN [ DEFERRED | IMMEDIATE | EXCLUSIVE ] TRANSACTION;

/*** @brief  数据库事务开始* @param  db:数据库文件描述符* @retval 成功返回0, 失败返回-1*/
int database_transaction_begin(sqlite3 *db)
{char* err_msg = NULL;char* beginTransactionCmd = "BEGIN TRANSACTION;";int beginRet = sqlite3_exec(db, beginTransactionCmd, NULL, NULL, &err_msg);if (beginRet != SQLITE_OK) {int sqliteErrCode = sqlite3_errcode(db);DBUG_SHOW("Begin transaction errorcode:%d\terror: %s\n", sqliteErrCode, err_msg);sqlite3_free(err_msg);return -1;}DBUG_SHOW("Transaction started successfully.\n");return 0;
}

2、事务提交

事务的目的是为了保证数据的一致性和完整性,而 COMMIT 命令则是将事务中的修改写入磁盘,以保证数据的持久性。

END TRANSACTION 是 COMMIT 的别名。

/*** @brief  数据库事务提交* @param  db:数据库文件描述符* @retval 成功返回0, 失败返回-1*/
int database_transaction_commit(sqlite3* db)
{char* err_msg = NULL;char commitCmd[] = "COMMIT;";int commitRet = sqlite3_exec(db, commitCmd, NULL, NULL, &err_msg);if (commitRet != SQLITE_OK) {int sqliteErrCode = sqlite3_errcode(db);DBUG_SHOW("Commit transaction errorcode:%d\terror: %s\n", sqliteErrCode, err_msg);sqlite3_free(err_msg);return -1;}DBUG_SHOW("Transaction committed successfully.\n");return 0;
}

3、事务回滚

事务是一组数据库操作,它们被视为一个单独的工作单元,要么全部成功执行,要么全部回滚。

在一个事务中,可以执行多个SQL语句,如:插入、删除、更新数据操作,但如果在执行过程中出现错误时,可以使用ROLLBACK回滚操作,撤销所有的更改恢复数据库到上一次提交数据操作的状态。

/*** @brief  数据库事务回滚* @param  db:数据库文件描述符* @retval 成功返回0, 失败返回-1*/
int database_transaction_rollback(sqlite3* db)
{char* err_msg = NULL;char rollbackCmd[] = "ROLLBACK;";int rollbackRet = sqlite3_exec(db, rollbackCmd, NULL, NULL, &err_msg);if (rollbackRet != SQLITE_OK) {int sqliteErrCode = sqlite3_errcode(db);DBUG_SHOW("Rollback transaction errorcode:%d\terror: %s\n", sqliteErrCode, err_msg);sqlite3_free(err_msg);return -1;}DBUG_SHOW("Transaction rolled back.\n");return 0;
}

4、读写事务

读取事务仅用于读取,写事务允许读取和写入。

读事务由 SELECT 语句启动,写事务由 CREATE、DELETE、DROP、INSERT 或 UPDATE 等语句(统称为“写语句”)启动。

开启了事务操作后,事务的写入并非立即写入到数据库存储文件中,而是被保存在缓存区中,只有进行了事务提交,缓冲区的数据才被写入到事务。

SQLite 支持来自不同数据库连接的多个同时读取事务,可能在不同的线程或进程中,但只支持一个同时写入事务。

/*** @brief  写入数据到数据库中* @param  db:数据库文件描述符* @param  data_cmd:写入数据命令* @retval 写入成功返回0,失败-1  */
int write_data_to_database(sqlite3* db, char* data_cmd)
{//"create table if not exists camera(time_stamp integer primary key, direction text, action text, x integer, y integer, z integer, vx integer, vy integer, vz integer, time integer);"//data_cmd内容格式参考:"insert into table values(123456789, 'U', 'T', 100, 200, 50, 10, 5, 30, 25);"int ret = 0;char* err_msg = NULL;ret = sqlite3_exec(db, data_cmd, NULL, NULL, &err_msg);if (ret){int sqliteErrCode = sqlite3_errcode(db);DBUG_SHOW("insert value to table err: code=%d, msg='%s'!\n", sqliteErrCode, err_msg);sqlite3_free(err_msg);return -1;}DBUG_SHOW("insert value to table successfully!\n");return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/31691.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

八、yolov8模型预测和模型导出(目标检测)

模型查看 模型预测 模型导出 模型训练完成后,找到训练文件生成文件夹,里面包含wights、过程图、曲线图。 模型预测 1、在以下文件夹中放入需要预测的图; 2、找到detect文件下的predict.py文件,修改以下内容。 3、右键点击…

【NLP练习】Transformer实战-单词预测

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 任务:自定义输入一段英文文本进行预测 一、定义模型 from tempfile import TemporaryDirectory from typing import Tuple from torch import nn…

AI时代:硬件狂欢,软件落寞 华为开发者大会2024

内容提要 分析师表示,目前AI行业大多数的支出都流向用于训练大模型的硬件或云基础设备。相较之下,软件应用商们在AI时代显得停滞不前。尽管软件应用商们十分热衷于构建AI工具,然而其收入状况却并不乐观。 文章正文 AI浪潮之下,英…

AIGC时代,重塑人的核心竞争力?

随着人工智能技术的飞速发展,AIGC(人工智能生成内容)的时代已经悄然而至。在这个时代,AI不再仅仅是一个技术概念,而是深入到我们生活的方方面面,从创作到生产,从娱乐到工作,AI都在以…

RabbitMQ 相关概念

引言 什么是消息中间件 消息是指在应用间传送的数据,包含文本字符串、JSON等。消息队列中间件(MQ)指利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型…

剑指offer 算法题(搜索二维矩阵)

剑指offer 第二题 去力扣里测试算法 思路一&#xff1a; 直接暴力遍历二维数组。 class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {for (unsigned int i{ 0 }; i < matrix.size(); i){for (unsigned int j{ 0 };…

Shell脚本:条件语句(if、case)

目录 硬编码 硬编码的缺点 条件判断 $? 命令行语句 判断指定目录是否存在 判断指定文件是否存在 判断指定对象是否存在 表达式形式语句 判断对象是否存在 判断对象是否有权限 与、或、非 运算 与运算 或运算 非运算 比较大小 判断磁盘利用率实验步骤 字符串…

Java基础之练习(2)

需求: 键盘录入一个字符串,使用程序实现在控制台遍历该字符串 package String;import java.util.Scanner;public class StringDemo5 {public static void main(String[] args) {//录入一个字符串Scanner sc new Scanner(System.in);System.out.println("请输入一个字符串…

1. 基础设计流程(以时钟分频器的设计为例)

1. 准备工作 1. 写有vcs编译命令的run_vcs.csh的shell脚本 2. 装有timescale&#xff0c;设计文件以及仿真文件的flish.f&#xff08;filelist文件&#xff0c;用于VCS直接读取&#xff09; vcs -R -full64 -fsdb -f flist.f -l test.log 2. 写代码&#xff08;重点了解代码…

如何将办公文档压缩成rar格式文件?

压缩包格式是我们生活工作中常用到的文件格式&#xff0c;那么如何得到一个rar格式的压缩文件&#xff1f;或者说如何将文件压缩成rar格式而不是zip格式呢&#xff1f;今天我们来了解一下如何压缩为rar格式文件。 首先&#xff0c;下载并安装WinRAR&#xff0c;然后用鼠标选择需…

【Python】成功解决TypeError: missing 1 required positional argument

【Python】成功解决TypeError: missing 1 required positional argument 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1…

React的服务器端渲染(SSR)和客户端渲染(CSR)有什么区别?

React的服务器端渲染&#xff08;SSR&#xff09;和客户端渲染&#xff08;CSR&#xff09;是两种不同的页面渲染方式&#xff0c;它们各自有不同的特点和适用场景&#xff1a; 服务器端渲染&#xff08;SSR&#xff09; 页面渲染: 页面在服务器上生成&#xff0c;然后将完整的…

复盘最近的面试

这个礼拜一直在面试&#xff0c;想着看看能否拿到不错的offer前去实习&#xff0c;从周一到周四&#xff0c;面了将近10家&#xff0c;特整理此份面经&#xff0c;希望对秋招的各位有所帮助 A公司 一面 面试官人很好&#xff0c;我回答的时候不会他会笑笑然后提醒我 自我介绍~…

数据通信与网络(三)

物理层概述&#xff1a; 物理层是网络体系结构中的最低层 它既不是指连接计算机的具体物理设备&#xff0c;也不是指负责信号传输的具体物理介质&#xff0c; 而是指在连接开放系统的物理媒体上为上一层(指数据链路层)提供传送比特流的一个物理连接。 物理层的主要功能——为…

项目中eventbus和rabbitmq配置后,不起作用

如下&#xff1a;配置了baseService层和SupplyDemand层得RabbitMQ和EventBus 但是在执行订阅事件时&#xff0c;发送得消息在base项目中没有执行&#xff0c;后来发现是虚拟机使用得不是一个&#xff0c;即上图中得EventBus下得VirtualHost&#xff0c;修改成一直就可以了

肆拾玖坊三级众筹模式玩法揭秘,白酒体验馆运作模式

发展至今&#xff0c;肆拾玖坊已积累了数百万忠实用户&#xff0c;拥有100多家分销商、5000多个新零售终端&#xff0c;覆盖全国34个省级行政区域、200余地市、1500个县区。成为中国创业界和酒行业的“现象级”企业。 今天&#xff0c;我们就来深入解析肆拾玖坊的营销模式&…

Linux入门攻坚——26、Web Service基础知识与httpd配置-2

http协议 URL&#xff1a;Uniform Resource Locator&#xff0c;统一资源定位符 URL方案&#xff1a;scheme&#xff0c;如http://&#xff0c;https:// 服务器地址&#xff1a;IP&#xff1a;port 资源路径&#xff1a; 示例&#xff1a;http://www.test.com:80/bbs/…

ios18计算器大更新使用指南,一招掌握新计算器使用技巧!

苹果推出iOS 18系统中&#xff0c;变化较大的之一就是以多年没有更新的计算器应用程序&#xff0c;新增了多个使用的功能&#xff0c;经过小编几天的使用&#xff0c;总结了几个iOS 18计算器的使用技巧和更新点分享给大家。 一、界面布局变化 与iOS 17相比&#xff0c;iOS18的…

Java学习笔记(二)变量原理、常用编码、类型转换

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍Java变量原理、常用编码、类型转换详细使用以及部分理论知识 🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 🍉博主收将持续更新学习记录获,友友们有任何问题可以在评论区留言 1、变量原理 1.1、变量的介绍 变量是程…

生成式AI时代,数据存储管理与成本如何不失控?

无数据&#xff0c;不AI。 由生成式AI掀起的这一次人工智能浪潮&#xff0c;对企业的产品、服务乃至商业模式都有着颠覆性的影响。因此&#xff0c;在多云、大数据、生成式AI等多元技术的驱动下&#xff0c;数据要素变得愈发重要的同时&#xff0c;企业对于数据存储的需求也在…