首页 > 编程知识 正文

数据库隔离级别怎么实现的,MySQL事务隔离级别

时间:2023-05-05 07:49:26 阅读:47184 作者:3667

2 .实现隔离水平

上一节介绍了ANSI定义的三个幻像和由禁止幻像的数量定义的事务隔离级别。 由于不存在严密严密的“公式”定义,因此各主流

2.1实现基于锁定的隔离级别

在演示基于锁定的隔离级别的实现之前,我将介绍一些与锁定相关的概念。 Item Lock :锁定访问可以防止dirty/fuzzy读取。

predicatelock(gaplock ) :通过锁定搜索范围,所有表扫描直接锁定所有表,可以防止phantom read。

Short duration :语句结束后解锁。

长持续时间:在提交或回滚事务后解除锁定。

结合上述锁定操作,可以实现不同级别的事务隔离标准,如下表所示。

其中S lock表示共享锁,X lock表示独占锁。

首先,如果要将X locks添加到所有写入,请选择Long duration。 否则,在解除short duration锁定后,在提交事务之前,这些更改可能会被其他事务写入操作复盖,从而导致脏写入操作。

接下来,关于读取操作:

Short duration Item S lock禁止发生P1,并且如果读取操作遇到正在修改的行(向写入事务添加了X Lock ),则在提交写入事务之前用S Lock进行阻止。

长持续时间项目S Lock禁止P2的发生,写入操作遇到读取事务(S Lock ),并且在提交或回退读取事务之前被X Lock阻止。

longdurationpredicate/tables lock禁止发生P3,当(范围)写入操作遇到范围读取操作(加Predicate S Lock )时,将提交或回滚读取事务

基于锁定实现的3个隔离级别分别可以禁止的幻像如下表所示。

但是,当今的数据库基于性能等多方面的考虑,很少完全基于锁定来实现隔离级别,MVCC Lock方式能够在不锁定的情况下满足读请求,是主流的实现方式。

2.2实现Oracle隔离级别

Oracle仅支持两种隔离级别:读提交和序列化。 虽然官方是这样描述的,但Oracle的序列化实际上是基于mvcc锁定的快照隔离(si )隔离级别的。

为了实现快照读取,全局变量SCN (系统提交/更改编号)在内部维护,并在提交事务时递增。 请求快照是获取当前最新的SCN。 Oracle将block分为两类来实现MVCC。 (1)目前区块是目前最新的页面,与永久化状态资料相符。 )一致读取块基于快照SCN生成适当的一致性版本页面。

以下两个具体示例说明了在不同隔离级别读写语句在数据库内部的作用。

Oracle处于read committed隔离级别,每个语句都捕获最新的快照,所有读取请求都是快照读取。 写入请求必须在更新行之前进行行锁定。 可能会发生丢失更新,因为其他事务不会因为更新了同一行而停止更新。 但是,只要不满足更新的谓词条件,更新就会停止。

Oracle处于可序列化隔离级别,在事务启动时捕获快照。 所有读取请求都是快照读取,写入请求必须在更新行之前进行行锁定。 锁上后,首先检查行。 如果最近修改此行的事务的SCN大于此事务的SCN,则它将被修改,表示此事务不可见,进行错误处理并避免丢失更新。 这种写入冲突的实现,显然是first committer wins。

下表说明了在Oracle的两个隔离级别上可以避免的幻像。

2.3

InnoDB也通过MVCC Lock方式实现了隔离级别。 其中,所有常规的select语句都是快照读取。 另一方面,delete/update/select for update等语句是锁定实现的当前读取,如下表所示。 (注:此表为peco na 5.6版的代码实现。

InnoDB的RC隔离级别性能与Oracle类似。 与Oracle相比,InnoDB RR隔离级别仍然无法避免丢失更新。 例如,以下示例: 这是因为InnoDB在RR隔离级别不确定其他事务在提交事务时是否修改了行。 这避免了由于si更新冲突而导致的回滚成本,并且可能存在丢失更新的风险。

update等操作是被锁定的当前读取,因此也存在Phantom Read的现象(参照下表)。 但是,如果将Txn1的update语句替换为select语句,则可以禁止Phantom Read现象,因为整个事务select语句使用相同的snapshot。

Innodb RR的实现方式并未严格排除丢失更新和可复制读取,但充分利用了MVCC的无读锁定并发性,并在当前读取导致新冲突激增时导致SI出现过多的行

InnoDB还实现了基于锁定的串行化(具体为2.1 ),禁止了所有的幻像。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。