本文最初发表在MySQL知识点和面试问题上。
我们想象一个场景。在此场景中,我们需要将多个相关数据插入数据库。不幸的是,此过程可能会遇到以下问题:
上面的任何问题都可能导致数据不一致。为了确保数据的一致性,系统必须能够处理这些问题。处理是我们抽象的首选机制,可以简化这些问题。数据库,目前,它已成为一个广泛的概念。
什么是交易?在一个单词中,事务是逻辑上的操作组,要么执行或未执行。
通常,最经典的交易是说示例是转移。如果小米希望转移1,000元的小元,则此转移将涉及两个关键操作,并且这两个操作都必须成功或失败。
事务将把这两个操作视为逻辑整体。总体操作要么成功或失败。这样,小米的平衡和小米的平衡就不会增加。
在大多数情况下,当我们谈论事务时,如果我们不提及分布式交易,它们通常是指数据库交易。
数据库交易在我们的日常开发中具有最大的联系。如果您的项目属于单个架构,则通常会有数据库事务。
数据库交易有什么影响?
简而言之,数据库交易可以确保数据库的多个操作(即SQL语句)构成逻辑整体。这些构成此逻辑总体的数据库操作:所有执行都是成功的,或者所有这些都不执行。
此外,关系数据库(例如:,,等)具有酸性特征:
?有必要在此处添加一个额外的点:只有在确保耐用性,原子能和隔离交易之后才能保证一致性。换句话说,a,i和d是手段,c是目的!大概是每个人,像我一样,很长一段时间以来被酸的概念误导了!我还发现,我还阅读了周的公共课程的公共课程“ Zhou Zhiming的软件架构类”(多少乐观书!!!)。
此外,DDIA的作者是他的书中“设计数据密集型应用程序”的作者:
单独使用数据库。
翻译的含义是:原子,隔离和耐用性是数据库的属性,并且一致性(从酸的意义上)是应用程序的属性。应用可能取决于数据库的原子和隔离属性以实现一致性,但这不取决于数据库。因此,字母C不是酸。
这本书“设计数据密集型应用程序(数据密集的应用系统设计)”是一个强烈的浪潮,值得阅读多次!近90%地址:https://github.com/vonng/ddia中已经是开源的。
欢迎加入我的知识星球,以获取更多采访干货。
在典型的应用程序中,多次交易是同时运行的,并且相同的数据经常操作其各自的任务(多个用户操作相同的数据)。尽管需要并发,但可能会导致以下问题。
无法反复阅读和幻影的差异:重复阅读的重点是修改。例如,对记录的重复读数发现某些列的值已被修改。DQL),记录增加或减少。
SQL标准定义了四个隔离水平:
读取的√√其他内容×√回收可读取××√serializable×××欢迎加入我的知识星球,以获取更多采访干货。
MySQL的隔离水平基于锁和MVCC机制。
可序列化的隔离水平是通过锁定达到的。除非序列化隔离水平,其他隔离水平基于MVCC。
但是,除序列化以外的其他隔离水平也可能需要使用锁定机制。例如,可重复阅读需要使用锁定阅读来确保不会有幻觉。
MySQL InnoDB存储引擎的默认支持隔离级别是可重复的。我们可以通过命令查看它,MySQL 8.0此命令更改为
从上面的SQL标准的四个隔离水平的引入可以看出。可以看出,在标准的SQL隔离级别定义中,可重复阅读(重复读数)无法阻止幻觉。
但是,InnoDB实现的重复阅读隔离级别实际上可以解决幻影读数的问题。下面有两个主要案例:
因为隔离级别越低,交易请求的锁较少,所以大多数数据库系统的隔离级别是读取的,但是您需要知道的是,InnoDB存储引擎使用可重复的阅读默认值而没有任何性能损失。
InnoDB存储引擎通常使用分布式交易时使用可序列的隔离水平。
“ MySQL技术内部课程:InnoDB存储引擎(第二版)”第7.7章写下:
InnoDB存储引擎为XA交易提供了支持,并通过XA交易支持分布式交易。分配的交易是指参与全球交易的多个独立的交易资源。Affairs资源通常是关系数据库系统,但也可以是其他类型的资源。事务要求所有事务的所有事务都提交或退缩,这改善了交易的原始酸要求。此外,当使用分布式交易时,必须将InnoDB存储引擎的交易隔离级别设置为可序列化。
有关MySQL交易隔离级别的详细介绍,您可以看到我写的文章:MySQL交易隔离级别的详细说明。
有关更多MySQL知识点和面试问题的总结,您可以检查MySQL知识点和面试问题摘要本文。
最近的文章选择:
Javaguide(“ Java Learning+ Tomkern Guide”重点关注Java的原始干货共享,对Java程序员的核心知识的主要知识为Java访谈做好了准备,这是首选的Javaguide!),目前为120K+ Star。
这并不容易,欢迎分享,请遵循我在掘金中的帐户。我将继续分享原始的干货!来吧,匆忙!
如果这篇文章对您有所帮助,请喜欢并分享它,这对我来说,继续分享和创建高质量文章非常重要。
原始:https://juejin.cn/post/7100834923648385037