理解MySQL事务的 "一致性"--作为约束的一致性
最编程
2024-04-23 14:49:35
...
从数据库的角度来看,它只关心transcation是否符合定义好的规则,如果符合规则,那么就是符合一致性的。
那么这些规则是什么?它可以是约束,可以是CASCADE(在父表上update/delete记录时,同步update/delete掉子表的匹配记录),也可以是trigger。亦或者是它们的组合。
用商品库存的例子来说。当库存>=1
时表示有商品,此时可以售卖。库存=0
表示没有商品不能售卖。根据我们朴素的生活经验,库存不能小于0
。
因此,我们的数据库对商品数量进行约束,使其数量大于等于0。当库存=0
时,倘若还执行update good_table set good_number=good_number-1
语句,数据库会拒绝执行,因为这破坏了“一致性”。
从数据库的角度来说,它认为的一致性就是如此。但是,对于业务上的逻辑,数据库并不知晓,它也不会关注。比如,两个用户同时在某一时刻对库存减一,导致某个用户的减库存操作被另一个用户覆盖(经常发生的超卖问题就是如此,比如前两天到处都能看到的名为“秒杀飞天茅台超卖”的文章
)。数据库并不能抵御这种错误的发生。
这就是我马上要讲的,一致性是一种目的。
上一篇: 关于说明文
下一篇: 译文:师父师父,什么叫事务!
推荐阅读
-
理解MySQL事务的 "一致性"--作为约束的一致性
-
什么是数据库事物?为什么需要数据库事物,事物有哪些特征?事物的隔离级别是什么?-1.什么是数据库事务? 1.事务是作为一个逻辑单元执行的一系列操作。一个逻辑工作单元必须具备四个属性,即ACID(原子性、一致性、隔离性和持久性)属性,只有这样才能成为事务: 原子性 2.事务必须是一个原子工作单元;它的数据修改要么全部执行,要么全部不执行。 一致性 3.事务完成时,所有数据必须保持一致。在相关数据库中,所有规则都必须适用于事务的修改,以保持所有数据的完整性。事务结束时,所有内部数据结构(如 B 树索引或双向链接表)必须正确无误。 隔离 4.并发事务的修改必须与其他并发事务的修改隔离。一个事务会在另一个并发事务修改之前或之后查看某一状态下的数据,而不会查看中间状态下的数据。这就是所谓的可序列化,因为它允许重新加载起始数据和重放一系列事务,从而使数据最终处于与原始事务执行时相同的状态。 持久性 5.事务完成后,它对系统的影响是永久性的。即使在系统发生故障的情况下,修改也会保留。 2. 为什么需要数据库事物,事物有哪些特征? 事物对数据库的作用是对数据进行一系列操作,要么全部成功,要么全部失败,防止出现中间状态,确保数据库中的数据始终处于正确、和谐的状态。 特征:原子性、一致性、隔离性、持久性,以及其他特征 原子性(Atomicity):所有操作在事务开始后,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出现错误时,会回滚到事务开始前的状态,所有操作就像没有发生一样。也就是说,事务是一个不可分割的整体,就像化学中的原子一样,是物质的基本单位。 一致性(Consistency):在事务开始之前和结束之后,数据库的完整性约束都没有被破坏。例如,如果 A 转钱给 B,A 不可能扣除这笔钱,但 B 却没有收到这笔钱。 隔离:在同一时间内,只允许一个事务请求相同的数据,不同事务之间没有干扰。例如,甲正在从一张银行卡上取款,在甲取款过程结束之前,乙不能向这张卡转账。 持久性(耐用性):事务完成后,事务对数据库的所有更新都将保存到数据库中,无法回滚 3.事务的隔离级别有哪些? 数据库事务有四种隔离级别,从低到高分别是未提交读取(Read uncommitted)、已提交读取(Read committed)、可重复读取(Repeatable read)、可序列化(Serializable)。此外,事务的并发操作中可能会出现脏读、不可重复读、幽灵读等情况。事务并发问题 脏读:事务 A 读取事务 B 更新的数据,然后事务 B 回滚操作,那么事务 A 读取的数据就是脏数据。 不可重复读取:事务 A 多次读取同一数据,事务 B 在事务 A 多次读取期间更新并提交数据,导致事务 A 多次读取同一数据时结果不一致。 幻影读取:系统管理员 A 将数据库中所有学生的具体分数改为 ABCDE 等级,但系统管理员 B 在此时插入了具体分数的记录,当系统管理员 A 更改结束后发现仍有一条记录未被更改,仿佛发生了幻觉,这称为幻影读取。 小结:不可重复读和幻读容易混淆,不可重复读侧重于修改,幻读侧重于增删。解决不可重复读问题只需锁定满足条件的行,解决幻读问题则需要锁定表 MySQL 事务隔离级别
-
保持 MySQL 和 Redis 数据一致性的 4 个策略
-
了解事务(Transaction)的四个特性--原子性、一致性、隔离性和持久性(ACID)
-
MySQL事务有四个主要特征:原子性、隔离性、永久性和一致性,以及它们在InnoDB引擎中的实现方式。 定义
-
标题:一文搞定Redis面试,附Redis面试大纲+常见Redis面试题-一、基础篇 快速上手 ①. 什么是redis ②. 为什么使用redis ③. 安装 ④. 基本使用(常见数据结构的命令) Java操作redis ①. Jedis ②. SpringBoot 启动redis的方式 ①. 配置文件 ②. 生产环境启动方案 二、进阶篇 redis实现session共享 redis缓存的使用 ①. 注解式 ②. Spring Cache 数据库和缓存双写一致性问题——穿透 redis实现附近的人 redis实现计数器 redis事务 redis分布式锁的使用 redis集群 redis实现延时队列 redis实现限流 redis实现布隆过滤器 发布订阅 redis优化 三、原理篇 redis单线程为什么性能好 数据类型的底层实现 持久化机制 过期策略 内存淘汰 redis优化 哨兵模
-
透彻理解MySQL事务隔离与并发一致性:通过简易实例说明
-
搞懂数据库里的事务:ACID原则与一致性,简单易懂讲解
-
理解并探索MySQL数据库中的事务概念及其实际使用场景
-
轻松理解MySQL事务的不同隔离等级全解析