数据库事务:确保数据完整性的关键20

简介: 【7月更文挑战第20天】事务是数据库操作的基本逻辑单位,确保数据一致性。ACID原则包括:原子性(操作全成或全败),一致性(事务前后数据合法性),隔离性(并发操作互不影响),持久性(提交后更改永久保存)。MySQL的InnoDB引擎支持事务,通过undo log实现回滚,redo log确保数据持久化。开启事务可使用`BEGIN`或`START TRANSACTION`,提交`COMMIT`,回滚`ROLLBACK`。

1、什么是事务


事务是数据库管理系统(DBMS)执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成,事务是不可以再分的最小的数据库工作单元,它包含了一个或者多个 DML 语句,比如 insert、update、delete。


InnoDB 存储引擎是支持事务的,这也是它成为默认的存储引擎的一个重要原因。


最常见的事务操作就是金融系统的银行转账场景,简单的说 A 账户转出多少金额给 B 账户,那么 B 账户必须完成对应金额的增加,这个转账业务才算成功,否则就出大问题了。

再比如电商系统的下订单场景,订单表和库存表一定是要在一个事务里完成的。

事务里的操作,要么同时成功,要么同时失败,这样才能保证事务操作的一致性。

2、事务的四大特性


事务的四大特性:ACID。

1、原子性(Atomicity)


原子性,又叫不可分割性,它是指一个事务(transaction)中的所有操作,要么全部成功,要么全部失败。如果事务在执行过程中发生错误,就会被回滚(rollback)到事务执行之前的状态,也就是说要返回原样,就像这个事务从来没有执行过一样。


原子性的回滚操作在 InnoDB 里面是通过 undolog 来实现的,它记录了数据修改之前的值(逻辑日志),一旦发生异常,就可以用 undo log 来实现回滚操作

2、一致性(Consistent)


一致性,指的是在事务执行前后,数据库的完整性约束没有被破坏,事务执行的前后都是合法的数据状态。比如主键必须是唯一的,字段长度符合要求等,也不会因为系统出现异常等原因导致数据前后的状态不一致。

除了数据库自身的完整性约束,我们在写代码的时候,还要满足用户自定义的完整性。比如:A 账户要给 B 账户转账 10000 元,如果 A 账户余额减少 10000 元,B 账户余额只增加了 1000 元,这个时候两个 sql 操作都可以成功,因为它是满足原子性的,但是明显存在业务问题;假设 A 账户里没有 10000 元,那么也是不能够执行转账操作的,一般用户自定义的完整性需要在代码中做好判断和控制。

3、隔离性(Isolation)


隔离性可以防止多个事务并发的读写操作时,由于交叉执行而导致数据的不一致。因为数据库允许多个并发事务同时去读写或者修改数据库的同一张表或者同一行数据,如果不加控制,数据一定会不一致。隔离性就是指多个并发事务对同一张表或者同一行数据的读写操作,应该是互相不干扰的。主要是指一个事务要操作的数据在提交之前,对其他事务应该是不可见的,从而可以保证业务数据的一致性。

数据库的隔离性是通过事务的隔离级别来实现的。

4、持久性(Durable)


持久性是指事务处理(对数据库的任意的增删改操作)结束后,对数据的修改就是永久的,即便数据库宕机也不会丢失(数据库的磁盘文件损坏除外)。

数据库宕机后的恢复是通过 redolog 来实现的数据持久性恢复,数据库在操作数据的时候,会先写到内存的 buffer pool 里面,同时记录 redo log。如果在写到磁盘之前出现异常,那么重启后就可以读取 redo log 的内容,然后再写入到磁盘,从而保证数据的持久性。

其实事务的原子性、隔离性、持久性,最后都是为了实现事务的最终一致性。

3、MySQL 如何开启事务


1、自动开启事务,自动提交或者回滚事务


InnoDB 有一个 autocommit 的参数(分成两个级别, session 级别和 global 级别)。


show variables like 'autocommit';

它的默认值是ON,如果 autocommit 值是 true/on 的话,我们在操作数据的时候,会自动开启一个事务,和自动提交事务;如果把 autocommit 设置成 false/off,那么数据库的事务就需要我们手动地去开启和手动地去结束。


2、手动开启事务,手动提交或者回滚


手动开启事务可以用 begin,也可以用 start transaction;结束一个事务也有两种方式,可以用 commit 提交一个事务,也可以用 rollback 回滚事务。

目录
相关文章
|
2月前
|
存储 缓存 数据库
数据库数据删除策略:硬删除vs软删除的最佳实践指南
在项目开发中,“删除”操作常见但方式多样,主要分为硬删除与软删除。硬删除直接从数据库移除数据,操作简单、高效,但不可恢复;适用于临时或敏感数据。软删除通过标记字段保留数据,支持恢复和审计,但增加查询复杂度与数据量;适合需追踪历史或可恢复的场景。两者各有优劣,实际开发中常结合使用以满足不同需求。
160 4
|
15天前
|
存储 SQL Java
数据存储使用文件还是数据库,哪个更合适?
数据库和文件系统各有优劣:数据库读写性能较低、结构 rigid,但具备计算能力和数据一致性保障;文件系统灵活易管理、读写高效,但缺乏计算能力且无法保证一致性。针对仅需高效存储与灵活管理的场景,文件系统更优,但其计算短板可通过开源工具 SPL(Structured Process Language)弥补。SPL 提供独立计算语法及高性能文件格式(如集文件、组表),支持复杂计算与多源混合查询,甚至可替代数据仓库。此外,SPL 易集成、支持热切换,大幅提升开发运维效率,是后数据库时代文件存储的理想补充方案。
|
5月前
|
数据采集 数据库 Python
有哪些方法可以验证用户输入数据的格式是否符合数据库的要求?
有哪些方法可以验证用户输入数据的格式是否符合数据库的要求?
277 75
|
3月前
|
数据库 Python
【YashanDB知识库】python驱动查询gbk字符集崖山数据库CLOB字段,数据被驱动截断
【YashanDB知识库】python驱动查询gbk字符集崖山数据库CLOB字段,数据被驱动截断
|
2月前
|
人工智能 关系型数据库 分布式数据库
让数据与AI贴得更近,阿里云瑶池数据库系列产品焕新升级
4月9日阿里云AI势能大会上,阿里云瑶池数据库发布重磅新品及一系列产品能力升级。「推理加速服务」Tair KVCache全新上线,实现KVCache动态分层存储,显著提高内存资源利用率,为大模型推理降本提速。
|
4月前
|
SQL 数据建模 BI
【YashanDB 知识库】用 yasldr 配置 Bulkload 模式作单线程迁移 300G 的业务数据到分布式数据库,迁移任务频繁出错
问题描述 详细版本:YashanDB Server Enterprise Edition Release 23.2.4.100 x86_64 6db1237 影响范围: 离线数据迁移场景,影响业务数据入库。 外场将部分 NewCIS 的报表业务放到分布式数据库,验证 SQL 性能水平。 操作系统环境配置: 125G 内存 32C CPU 2T 的 HDD 磁盘 问题出现的步骤/操作: 1、部署崖山分布式数据库 1mm 1cn 3dn 单线启动 yasldr 数据迁移任务,设置 32 线程的 bulk load 模式 2、观察 yasldr.log 是否出现如下错
|
4月前
|
JSON Java 关系型数据库
Hutool创建数据源工厂动态查询不同数据库不同数据表的数据
Hutool创建数据源工厂动态查询不同数据库不同数据表的数据
80 2
|
3月前
|
SQL Java 数据库连接
【YashanDB数据库】由于网络带宽不足导致的jdbc向yashandb插入数据慢
由于网络带宽不足导致的jdbc向yashandb插入数据慢
|
3月前
|
SQL 数据库 索引
【YashanDB数据库】大事务回滚导致其他操作无法执行,报错YAS-02016 no free undo blocks
大事务回滚导致其他操作无法执行,报错YAS-02016 no free undo blocks