当前位置: 首页 > news >正文

SQLite事务处理

语法

BEGIN TRANSACTION;
COMMIT TRANSACTION; (或END TRANSACTION;
ROLLBACK TRANSACTION;

事务处理

除了一些PRAGMA语句以外,其它访问数据库的语句会自动启动事务处理,并且在结束时自动提交。
通过上一节的命令可以手动控制事务处理过程。

如果在事务期间关闭了数据库,或者发生了错误并且通过ON CONFLICT指定了冲突处理算法,则会自动回滚事务。
事务控制语句不能嵌套执行,可以通过SAVEPOINT和RELEASE命令模拟嵌套行为。

通过SAVEPOINT在事务中创建保存点,回滚时指定保存点名称可回滚到指定位置,之前的处理将保存。

读事务和写事务

SQLite支持多个数据库在不同线程或进程同时读,但只支持一个写事务存在。
读事务只能读数据,写事务可以读也可以写。通过SELECT可以启动一个读事务,CREATE,DELETE,DROP和UPDATE启动写事务。在一个读事务期间如果出现写操作,事务会升级为写事务。但如果此时有另一个数据库连接正在处理写事务,上一个写操作就会失败并报告SQLITE_BUSY错误。

当一个读事务活动时,另一个连接对相同表的写操作不会反馈到读事务中,也就是说不会读到写操作刚刚写入的数据。

DEFERRED, IMMEDIATE和EXCLUSIVE事务

DEFERRED是默认行为,表示在访问数据库之前事务并未真正启动,仅仅是设置一个标记告诉数据库关闭自动提交功能。事务会在显式调用COMMIT或ROLLBACK或发生错误时自动回滚执行以重新启用自动提交操作。
DEFERRED启动后,如果第一个语句时SELECT,则启动一个读事务。后续出现写操作时自动升级为写事务。

IMMEDIATE语句则是告诉数据库立即启动一个写事务,并不会通过下一条语句是读还是写来确定事务类型。如果此时另一个连接已启动了一个写事务,则该操作失败并报告SQLITE_BUSY错误。

EXCLUSIVE与IMMEDIATE类似,在WAL mode格式下是完全相同的,但在其它日志模式下该语句会阻止其它连接读取数据库。

隐式事务和显式事务

隐式事务(不是通过BEGIN启动的事务)在语句完成后自动提交事务。当一条语句reset或finalized时,其打开的游标自动关闭,标识着语句完成。有些语句可能因为事务控制原因在reset或finalized之前完成,但这一行为无法保证,所以不要假定在reset或finalized之前语句已结束。可以保证的是调用sqlite3_reset或sqlite3_finalize之后语句一定是完成状态。sqlite3_blob在启动增加BLOB读写期间,只有在明确关闭blob时才表示语句完成。

COMMIT命令会立即执行提交操作,即便有SELECT语句尚未完成也没关系,但如果有写操作未完成则会报SQLITE_BUSY错误。

这应该是发生在事务有多线程处理的情况。

如果有另一个线程或进程有读操作,COMMIT操作可能报告SQLITE_BUSY错误,此时可以等待那个读操作完成后再次尝试COMMIT。

早期版本中(3.7.11之前)ROLLBACK可能因存在未完成的查询操作而报告SQLITE_BUSY错误。之后的版本遇到这一行为时不会报错,但会撤销未完成的查询操作,并导致那些操作返回SQLITE_ABORT错误或SQLITE_ABORT_ROLLBACK错误。在3.8.8及之后的版本中,只要回滚操作不修改表结构,未完成的读操作将继续处理而不受ROLLBACK影响。

如果PRAGMA_journal_mode设置为OFF(关闭回滚日志),ROLLBACK的行为不确定。

事务出错处理

有些错误不会导致事务回滚,以下错误会导致自动回滚:

  • SQLITE_FULL: 磁盘空间不足
  • SQLITE_IOERR: 磁盘IO错误
  • SQLITE_BUSY: 数据库正在被其它进程使用
  • SQLITE_NOMEM: 内存不足

对于这些错误,SQLite尝试回滚刚才发生错误的操作,而事务内之前完成的操作则保持不变,并且继续执行事务内的其它操作。但是通常我们会希望回滚事务内的所有操作以确保数据的一致性,通过C语言接口sqlite3_get_autocommit可以检查SQLite是采取了单个回滚还是全部回滚行为。

建议在应用程序内拦截这些错误以显式调用ROLLBACK命令回滚整个事务。如果SQLite本身已回滚了下个事务,再调用ROLLBACK会报错,但这个错误无关紧要,可以忽略。

后期版本可能会增加其它导致事务自动回滚的错误清单,也可能改变对不同错误的回滚行为,特别是针对这些错误简化回滚行为。

原文链接:https://www.sqlite.org/lang_transaction.html

相关文章:

SQLite事务处理

语法 BEGIN TRANSACTION; COMMIT TRANSACTION; (或END TRANSACTION;) ROLLBACK TRANSACTION; 事务处理 除了一些PRAGMA语句以外,其它访问数据库的语句会自动启动事务处理,并且在结束时自动提交。 通过上一节的命令可以手动控制…...

Java中CountDownLatch使用场景

在Java的并发API中,CountDownLatch是一个同步器,它允许一个或多个线程等待一组操作完成。 如果您正在开发一个服务器应用程序,该应用程序在开始处理请求之前需要初始化各种资源。这些资源可能是这样的: 加载配置文件建立数据库连…...

漏刻有时数据可视化Echarts组件开发(41)svg格式地图应用

1.定义SVG文件 var svg ;2.注册地图函数 Echarts.registerMap是Echarts图表库中用于注册地图的函数。它可以将第三方地图或自定义地图数据与Echarts进行集成,使用Echarts的API进行绘制。使用方法如下: echarts.registerMap(mapName, geoJson) 参数map…...

firefox的主题文件位置在哪?记录以防遗忘

这篇文章写点轻松的 最近找到了一个自己喜欢的firefox主题,很想把主题的背景图片找到,所以找了下主题文件所在位置 我的firefox版本:版本: 118.0.1 (64 位)主题名称: Sora Kawai 我的位置在 C:\Users\mizuhokaga\AppData\Roaming\Mozilla\Firefox\Profiles\w0e4e24v.default…...

Vuex获取、修改参数值及异步数据处理

14天阅读挑战赛 学不可以已... 目录 一、Vuex简介 1.1 vuex介绍 1.2 vuex核心 二、Vuex使用 2.1 Vuex安装 2.2 创建store模块 2.3 创建vuex的store实例并注册上面引入的各大模块 三、使用Vuex获取、修改值案例 3.1 创建两个菜单组件 3.2 配置路由 3.3 模拟菜单数据 …...

【 OpenGauss源码学习 —— 列存储(autoanalyze)(二)】

列存储(autoanalyze)(二) 概述PgStat_StatTabEntry 结构体pgstat_count_heap_insert 与 pgstat_count_cu_insert 函数CStoreInsert::BatchInsertCommon 函数pgstat_count_cu_update 函数pgstat_count_cu_delete 函数pgstat_count_…...

使用postman 调用 Webservice 接口

1. 先在浏览器地址栏 访问你的webService地址 地址格式: http://127.0.0.1:8092/xxxx/ws(这个自己的决定)/xxxxXccv?wsdl 2. post man POST 访问wwebService接口 地址格式: http://127.0.0.1:8092/xxxx/ws(这个自己的决定)/xxxxXccv <soapenv:Envelope xmlns:soapenv…...

程序员Google插件推荐

文章目录 AdBlock (广告拦截插件)SuperCopy 超级复制Octotree (github增强工具)GitZip for github (github增强工具)JSON-handleSimpleExtManager(管理谷歌插件)OneTab (标签页合并)PostWoman(接口调试)篡改猴 (Tampermonkey)FeHelper(前端助手) AdBlock (广告拦截插件) ☆ 拦截…...

机器学习中常见的监督学习方法和非监督学习方法有哪些。

问题描述&#xff1a;最近面试某些公司算法岗&#xff0c;看到一道简答题&#xff0c;让你举例熟悉的监督学习方法和非监督学习方法。 问题解答&#xff1a; 监督学习方法常见的比较多&#xff1a; 线性回归&#xff08;Linear Regression&#xff09;&#xff1a; 用于回归问…...

UEFI基础——测试用例Hello Word

Hello 测试用例 硬件环境&#xff1a;龙芯ls3a6000平台 软件环境&#xff1a;龙芯uefi固件 GUID获取网址&#xff1a;https://guidgen.com 一、创建工程 mkdir TextPkg/三个文件 Hello.c 、 Hello.inf 、HelloPkg.dsc 1.1 Hello.c /** fileThe application to print hello …...

【tomcat、java】

java&#xff1a;maven配置 1.安装插件 <build><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.1</version><configuration><port&…...

京东获取推荐商品列表 API

item_recommend-获取推荐商品列表 请求参数 请求参数&#xff1a;type 参数说明&#xff1a;type:推荐类型 进入API测试页 响应参数 Version: Date: 名称类型必须示例值描述 items items[]0获取推荐商品列表 num_iid Bigint010021415166448宝贝ID detail_url String0http…...

rust cfg的使用

前提是一个crate倒入另一个crate。 先看结构 test_lib目录结构 这与另一个crate处于同一个目录,所以另一crate倒入的时候在Cargo.toml中使用如下语句。 test_lib = {path = "../test_lib" }先在test_lib/src/abc/abc.rs中添加没有cfg的两个函数做测试。 pub fn…...

电脑屏幕怎么录制?5 个最佳免费录屏软件

您是否想使用网络摄像头录制优酷视频、抖音直播或在线课程等项目&#xff0c;但完全不知道如何开始&#xff1f; 不用担心。有很多软件选项可以帮助您。虽然每一款都有不同的功能&#xff0c;但它们都能够录制网络摄像头并输出精美的高质量视频。 以下是我们精选的最佳作品。…...

vscode 调试使用 make 编译的项目

1、首先点击运行 --> 启动调试&#xff1a; 2、选择g或gcc生成和调试活动文件&#xff1a; 3、出现下面提示是正常的&#xff0c;点击仍要调试&#xff1a; 点击打开“launch.json”&#xff1a; 4、此时会在项目工作目录下生成tsak.josn和launch.json文件&#xff1a; 如…...

Docker修改阿里源

在一次安装rtmp推流服务时&#xff0c;总是无法下载源&#xff0c;估计是国外资源下载超时照成的&#xff0c;于是想到修改为国内源。 docker pull alfg/nginx-rtmp Using default tag: latest latest: Pulling from alfg/nginx-rtmp 530afca65e2e: Retrying in 7 seconds c20…...

有必要买一台内衣裤专洗机吗?家用小洗衣机推荐

随着内衣洗衣机的流行&#xff0c;很多小伙伴在纠结该不该入手一款内衣洗衣机&#xff0c;专门来洗一些贴身衣物&#xff0c;答案是非常有必要的&#xff0c;因为我们现在市面上的大型洗衣机只能做清洁&#xff0c;无法对我们的贴身衣物进行一个高强度的清洁&#xff0c;而小小…...

高精度与高精度的乘法---基础算法

看到一个博主写得不错&#xff0c;我也照猫画虎&#xff1a;&#xff09; 原因 在计算两个非负整数时&#xff0c;如果位数很大&#xff0c;连 long long 类型都存储不了&#xff0c;就要使用到高精度的乘法 原理 原理依旧是模拟人计算两个数的积&#xff0c;早在小学我们已…...

护眼灯有效果吗?科普护眼灯的作用与推荐

现在我们很多家长对自己孩子的视力十分关心&#xff0c;生怕自己的孩子是近视、远视、弱视等等。对于父母而言&#xff0c;在孩子读书压力大课业重的关键时期&#xff0c;为孩子选择合适的桌椅&#xff0c;保护灯具从而保护孩子的眼睛是非常重要的事情!那么买给孩子读书做功课的…...

【办公自动化】在Excel中按条件筛选数据并存入新的表2.0(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…...

全能B站资源管理工具:BiliTools让视频下载与管理效率提升90%

全能B站资源管理工具&#xff1a;BiliTools让视频下载与管理效率提升90% 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱&#xff0c;支持视频、音乐、番剧、课程下载……持续更新 项目地址: https://gitcode.com/GitHub_Trending/bili…...

效率提升秘籍:用快马AI自动生成六花直装更新页面,节省开发时间

作为一名经常需要维护应用更新页面的开发者&#xff0c;我深刻体会到手动编写更新日志的繁琐。每次版本迭代&#xff0c;从整理更新内容到排版发布&#xff0c;往往要耗费大量时间。最近尝试用InsCode(快马)平台的AI功能自动生成更新页面&#xff0c;效率提升非常明显。 传统更…...

别再只会抓HTTP了!手把手教你配置Fiddler抓取手机App的HTTPS请求(含证书安装避坑)

移动端HTTPS抓包实战&#xff1a;Fiddler配置与证书避坑指南 每次看到App里那些神秘的网络请求&#xff0c;你是不是也好奇它们到底在传输什么数据&#xff1f;作为开发者或测试人员&#xff0c;能够抓取和分析这些请求是基本功。但面对HTTPS加密流量&#xff0c;很多新手往往束…...

Spring Framework测试框架完整指南:从单元测试到集成测试的10个最佳实践

Spring Framework测试框架完整指南&#xff1a;从单元测试到集成测试的10个最佳实践 【免费下载链接】spring-framework spring-projects/spring-framework: 一个基于 Java 的开源应用程序框架&#xff0c;用于构建企业级 Java 应用程序。适合用于构建各种企业级 Java 应用程序…...

OpenClaw 超级 AI 实战专栏【补充内容】AI开发实操:减少Token用量、提升模型效率的8个核心技巧(附代码)

目录 一、核心前提:理解Token消耗的关键场景 二、6种优化方案(附案例+代码) 方案1:精简Prompt(最易落地,立竿见影) 核心思路 应用案例 代码实现 方案2:上下文窗口裁剪(避免历史信息冗余) 核心思路 应用案例 代码实现 方案3:输入文本摘要压缩(批量处理场景…...

从按键消抖到I2C通信:深入浅出聊聊MCU上拉/下拉电阻与开漏输出的那些坑

从按键消抖到I2C通信&#xff1a;深入浅出聊聊MCU上拉/下拉电阻与开漏输出的那些坑 在嵌入式系统开发中&#xff0c;GPIO配置看似简单&#xff0c;却暗藏玄机。记得第一次调试I2C总线时&#xff0c;通信速率始终上不去&#xff0c;最后发现竟是上拉电阻选型不当&#xff1b;另一…...

基于springboot的中医院问诊知识科普系统的设计与实现-vue

目录系统架构设计前端技术选型模块划分关键技术实现开发阶段规划部署方案项目技术支持源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作系统架构设计 采用前后端分离架构&#xff0c;前端使用Vue.js框架&#xff0c;后端基于SpringBoot构建R…...

保姆级教程:在OrangePi 5 Plus上从SSD启动Ubuntu 22.04,并配置ROS2 Humble环境

OrangePi 5 Plus开发板全栈配置指南&#xff1a;从SSD启动到ROS2 Humble环境搭建 拿到一块OrangePi 5 Plus开发板时&#xff0c;如何快速搭建一个稳定高效的开发环境&#xff1f;本文将手把手带你完成从系统烧录到ROS2环境配置的全过程&#xff0c;特别针对ARM64架构的优化方案…...

深入对比:在Vivado中设计异步复位、同步复位和带使能D触发器的实战差异与选型建议

深入对比&#xff1a;在Vivado中设计异步复位、同步复位和带使能D触发器的实战差异与选型建议 当你在设计一个状态机或数据流水线时&#xff0c;是否曾为选择哪种D触发器而犹豫不决&#xff1f;异步复位、同步复位还是带使能的D触发器&#xff0c;每种设计都有其独特的应用场景…...

ANPC逆变器下垂控制的“阻抗相消术

ANPC-下垂功率均分-两台ANPC三电平逆变器在不同阻感性线路阻抗下实现有功均分与无功均分&#xff0c;采用积分改进法&#xff08;阻抗相消法&#xff09;&#xff0c;电压电流双闭环控制&#xff0c;中点电位平衡控制&#xff0c;SPWM调制。 1.下垂&#xff0c;电压电流双闭环控…...