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

Sqlite3数据库

工具库的使用:程序编写时#include <库名.h>即可调用库中的函数 编译时链接工具库;

注意:数据库中不区分字母大小写;
SQLite 中的事务是数据库操作中非常重要的一个概念,它用于确保数据库操作的完整性和一致性。以下是关于 SQLite 中事务的详细介绍:

1. 事务的基本概念

事务是一组数据库操作的集合,这些操作要么全部成功,要么全部失败。在事务执行过程中,如果任何一个操作失败,那么整个事务都会被撤销,数据库会恢复到事务开始之前的状态。事务具有以下四个特性(ACID):

  • 原子性(Atomicity):事务中的所有操作要么全部执行,要么全部不执行。
  • 一致性(Consistency):事务执行前后,数据库的状态都必须满足完整性约束。
  • 隔离性(Isolation):多个事务并发执行时,一个事务的执行不会被其他事务干扰。
  • 持久性(Durability):一旦事务提交,其对数据库的更改就会被永久保存。

2. 事务的使用

在 SQLite 中,事务的使用主要通过 SQL 语句来控制。以下是事务的基本操作:

(1)开始事务

使用 BEGIN TRANSACTIONBEGIN 语句来开始一个事务。例如:

BEGIN TRANSACTION;

或者

BEGIN;

这两个语句的效果是相同的,都表示开始一个新的事务。

(2)提交事务

如果事务中的所有操作都成功执行,可以使用 COMMIT 语句来提交事务,将事务中的更改永久保存到数据库中。例如:

COMMIT;

提交事务后,事务中的所有更改都会被写入数据库。

(3)回滚事务

如果事务中的某个操作失败,可以使用 ROLLBACK 语句来回滚事务,撤销事务中的所有更改,使数据库恢复到事务开始之前的状态。例如:

ROLLBACK;

回滚事务后,事务中的所有操作都不会对数据库产生影响。

3. 事务的隔离级别

SQLite 支持以下几种事务隔离级别:

  • READ UNCOMMITTED(读未提交):允许一个事务读取另一个事务未提交的数据。这种隔离级别下,可能会出现脏读、不可重复读和幻读的问题。
  • READ COMMITTED(读已提交):一个事务只能读取另一个事务已经提交的数据。这种隔离级别下,不会出现脏读,但可能会出现不可重复读和幻读。
  • REPEATABLE READ(可重复读):一个事务在读取数据时,其他事务不能对这些数据进行修改,直到当前事务完成。这种隔离级别下,不会出现脏读和不可重复读,但可能会出现幻读。
  • SERIALIZABLE(可串行化):这是最高的隔离级别,事务之间完全隔离,不会出现任何并发问题。但这种隔离级别下的性能开销最大。

SQLite 默认的隔离级别是 SERIALIZABLE,但可以通过设置 PRAGMA read_uncommitted 来改变隔离级别。例如:

PRAGMA read_uncommitted = 1; -- 设置为 READ UNCOMMITTED

4. 自动提交模式

SQLite 默认是自动提交模式(autocommit mode)。在这种模式下,每条单独的 SQL 语句都会自动开启一个事务,并在执行完成后自动提交事务。例如:

INSERT INTO table_name (column1, column2) VALUES (value1, value2);

在自动提交模式下,这条 INSERT 语句会自动开启一个事务,执行完成后自动提交。

如果需要手动控制事务,可以通过执行 BEGIN TRANSACTIONBEGIN 语句来关闭自动提交模式。关闭自动提交模式后,需要手动提交或回滚事务。例如:

BEGIN TRANSACTION;
INSERT INTO table_name (column1, column2) VALUES (value1, value2);
COMMIT;

5. 事务的注意事项

  • 事务的嵌套:SQLite 不支持嵌套事务。如果在事务中再执行 BEGIN TRANSACTION,会报错。
  • 锁机制:在事务执行过程中,SQLite 会使用锁机制来保证数据的一致性。锁的类型包括共享锁(shared lock)和排他锁(exclusive lock)。共享锁允许多个事务同时读取数据,但不允许修改;排他锁则允许一个事务独占数据,其他事务不能读取或修改。
  • 性能影响:事务的使用会对数据库性能产生一定的影响。频繁地开启和提交事务会增加系统的开销,因此在实际应用中需要合理控制事务的使用。

6. 示例

以下是一个使用事务的完整示例:

-- 开始事务
BEGIN TRANSACTION;

-- 插入数据
INSERT INTO students (name, age) VALUES ('Alice', 20);
INSERT INTO students (name, age) VALUES ('Bob', 22);

-- 更新数据
UPDATE students SET age = 21 WHERE name = 'Alice';

-- 提交事务
COMMIT;

如果在事务执行过程中出现任何错误,可以使用 ROLLBACK 来回滚事务,撤销所有更改。

通过合理使用事务,可以确保数据库操作的完整性和一致性,提高数据库系统的可靠性。
主键:

  • 唯一的标识一行(一张表中只能有一个主键)
  • 主键应该说对用户没有意义的(常用于索引)
  • 永远不要更新主键,否则违反用户没有意义原则
  • 主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等
  • 主键应当有计算机自动生成(保证唯一性)

唯一约束:

  • 用来保证一个列(或一组列)中数据唯一,类似于主键,但跟主键有区别
  • 表可以包含多个唯一约束,但只允许一个主键
  • 唯一约束列可修改或更新
  • 创建表时可通过unique来设置
    检查约束:
  • 用来保证一个列(或一组列)中的数据满足一组指定的条件
  • 指定范围,检查最大或最小范围,通过check实现
    视图不包含数据,因此在每次使用视图时,实际上都必须执行查询语句
    视图相当于创建视图的时候as后面的SQL语句查询得到的结果集合
    从返会结果信息(视图)中再检索视图与表一样

索引是为了在大数据库中,实现搜索、查找、条件查找等
索引避免使用情况:
表的数据量不大
表的大部分操作不是查询
大量出现NULL值的情况

C程序调用sqlite3接口;

相关文章:

  • 客服机器人怎么才能精准的回答用户问题?
  • Linux shell脚本-概述、语法定义、自定义变量、环境变量、预设变量、变量的特殊用法(转义字符、单双引号、大小括号)的验证
  • Labview和C#调用KNX API 相关东西
  • 《深度剖析:鸿蒙系统不同终端设备的UI自适应布局策略》
  • Linux系统管理与编程06:任务驱动综合应用
  • APIJSON快速入门
  • 西门子仿真实例位置
  • Linux小知识
  • SCI论文阅读指令(特征工程)
  • (学习总结29)Linux 进程概念和进程状态
  • solana增加流动性和删除流动性
  • Doris官网上没有的一些Fe参数了,都在源码中
  • HC-05与HC-06蓝牙配对零基础教程 以及openmv识别及远程传输项目的概述
  • Vala编程语言教程-面向对象编程语基础
  • Java-腾讯云短信模板兼容阿里云短信模板-短信模板参数生成
  • CCF-CSP认证 202206-2寻宝!大冒险!
  • configured user limit (128) on the number of inotify instances has been reached
  • 常考计算机操作系统面试习题(三上)
  • 项目代码的构建
  • 【QA】单件模式在Qt中有哪些应用?
  • 外交部回应涉长江和记出售巴拿马运河港口交易:望有关各方审慎行事,充分沟通
  • 商务部:入境消费增长潜力巨大,离境退税有助降低境外旅客购物成本
  • 以军称若停火谈判无进展,将大幅扩大加沙军事行动
  • 长三角数智文化产业基金意向签约会成功举办
  • 电厂 | 京东、美团为什么抢着为你送外卖?
  • 冲击一英里4分钟大关,基普耶贡挑战女子中长跑极限