iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Oracle、MySQL、DB2并发控制机制的异同是什么
  • 675
分享到

Oracle、MySQL、DB2并发控制机制的异同是什么

2024-04-02 19:04:59 675人浏览 八月长安
摘要

这篇文章主要介绍“oracle、Mysql、DB2并发控制机制的异同是什么”,在日常操作中,相信很多人在Oracle、mysql、DB2并发控制机制的异同是什么问题上存在疑惑,小编查阅了各式资料,整理出简单

这篇文章主要介绍“oracleMysql、DB2并发控制机制的异同是什么”,在日常操作中,相信很多人在Oracle、mysql、DB2并发控制机制的异同是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Oracle、Mysql、DB2并发控制机制的异同是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

数据库的数据一致性支持机制:事务日志

首先我们看看什么是事务。

一、事务

事务:又称为交易,访问数据库系统的可恢复的最小单元。

1、事务的ACID

  • 原子性(Atomicity):事务为一个整体的工作单元,事务对数据库的操作要么全部执行,要么全部取消;

  • 一致性(Consistency):事务完成时,所有数据都保持一致状态;

  • 隔离性(Isolation):事务所做的修改必须与其他事务所做的修改隔离。事务查看数据时数据的状态要么为其他事务修改之前要么为其他事务修改之后,不会为中间状态。即多个事务不能同时修改同一份数据;

  • 持久性(Durability):事务提交后,对数据库所做的修改会永久保存。

2、事务的初始化和终止

事务在可执行的SQL第一次执行时会自动初始化,事务一旦初始化,就必须终止(COMMIT或ROLLBACK)。

1)关于事务的COMMIT和ROLLBACK

多数情况下,事务通过执行COMMIT或ROLLBACK终止事务。执行COMMIT语句后,事务初始化后对数据库做出的所有改变都会变成永久的;执行ROLLBACK语句后,事务初始化后对数据库做出的所有改变都会被撤销,数据库返回事务开始之前的状态。

2)关于不成功的事务的结果

上面说了当事务被COMMIT或ROLLBACK终止语句后会发生什么,如果事务完成之前系统发生故障,会发生什么?这种情况下,数据库管理器将撤销所有未COMMIT的修改,从而恢复数据的一致性。

DB2中通过ACTIVE  LOG日志文件实现撤销修改。日志文件包含关于事务执行的每个语句的信息,以及事务是否被成功COMMIT或ROLLBACK的信息。

MySQL和Oracle利用undo log撤销修改。undo  log记录了行的修改操作,执行事务中由于某种原因失败,或使用ROLLBACK时,就可以利用undo log将数据恢复到修改之前的样子。

3、事务的隔离级别

1)潜在问题

事务为什么需要多种可以设置的隔离级别呢?通常,锁可以实现并发操作中事务的隔离,保证数据的一致性。锁提高了并发性能,但会带来潜在的问题:

  • 脏读:当前事务可以读到另外一个事务中未提交的数据。

  • 不可重复读:在一个事务内读到的同一条数据是不一样的。

  • 幻读:事务A在相同条件下第二次读取时读到新插入的数据。

  • 丢失更新:一个事务的更新操作会被另一个事务的更新操作所覆盖,从而导致数据的不一致。 例如:

    • 事务T1将行记录修改为V1,事务T1未提交。

    • 事务T2将行记录修改为V2,事务T2未提交。

    • 事务T1提交。

    • 事务T2提交。

在当前数据库的锁机制下不会导致理论意义上的丢失更新问题,但是实际上在所有多用户计算机系统环境下都有可能产生这个问题。例如:

  • 事务T1查询一行数据,放入本地内存,显示给User1。

  • 事务T2查询一行数据,放入本地内存,显示给User2。

  • User1修改这行记录,更新数据库并提交。

  • User2修改这行记录,更新数据库并提交。

这些问题往往和系统数据库的使用方式和形态有关。而设置事务的隔离级别,就是根据不同的场景来解决以上问题。比如上面所说的丢失更新问题,隔离级别中SELECT…FOR  UPDATE即带有更新意图读的时候,步骤1、2都是要上写锁的,避免丢失更新的问题。下面详解数据库的隔离级别及其加锁方式。

2)数据库的隔离级别及其加锁方式

① SQL标准定义的四个隔离级别

  • READ UNCOMMITTED:未提交读。事务可以看到其他事务所有未提交的数据。读取数据不加锁;

  • READ COMMITTED:提交读。事务只可以看到其他事务已经提交的数据;

  • REPEATABLE READ:重复度。锁定事务引用的符合检索条件的部分行,其他事务不可修改这些行,但可执行INSERT操作。即可能出现幻读;

  • SERIALIZABLE:可串行化。强制的进行排序,在每个读数据行上添加锁,所有事务依次逐个执行,事务之间不会产生干扰。事务提交后释放锁。会导致大量超时现象和锁竞争。

② 四种隔离级别会导致的问题

隔离级别
脏读
不可重复读
幻读
READ UNCOMMITTED
√
√
√
READ COMMITTED
×
√
√
REPEATABLE READ
×
×
√
SERIALIZABLE
×
×
×

③ 数据库中的隔离级别

DB2中的隔离级别:

  • CS(Cursor  Stability):游标稳定性。逐行锁定数据,该行数据未修改时,锁定解除,继续加锁读取下一行,该行数据有修改时,则该行锁定持续到事务终止。CS的程序不能查看其他程序未COMMIT的更改。

CS提供了最大的并发性。但同一事务同一游标被处理两次,可能返回不同的结果,即不可重复度;CS程序读取的行上有任何可更新游标时,其他任何应用程序都不能更新或删除该行。

CS是DB2默认的隔离级别。在需要最大并行性但只能看到其他程序已COMMIT的数据时使用。

  • RR(Repeatable  Read):可重复读。RR会锁定事务引用的所有行,直到COMMIT。其他程序不能修改该数据,如果一条数据被访问两次,返回相同的结果。

RR是最高隔离级别,可以最好的保证数据一致性,但是大量锁定数据,会导致并发度大大降低,同时有可能超过系统定义的持有锁数量的限制。

相当于标准定义隔离级别中的SERIALIZABLE相比,上锁范围一致。

  • RS(Read  Stability):读稳定性。RS会锁定事务引用的所有行中符合检索条件的部分行。其他程序不可修改,但可执行INSERT操作,所以同一事务中,如果数据被访问两次可能返回新插入的数据,即幻读,但是旧数据不会有改变。

相比RR,RS锁定数据的数量大大减少,并发度得到提升。比较适合在并发环境下运行,但只适合在同一事物中不会多次发出相同查询,或不要求相同查询获得相同结果的程序,避免发生幻读。

DB2的RS和标准定义隔离级别中的REPEATABLE READ(重复读)类似,避免了脏读,但是会出现幻读问题。

  • UR(Uncommitted  Read):未提交读,也就是“脏”读。UR不会加任何锁,可以读数据库中的任何数据,包含已修改但未COMMIT的数据。读的数据可能与真实的数据有一定差距。

UR级别最常用于只读表上的查询,或者只执行查询且不关心能否读到其他程序未COMMIT的数据时常用。

UR相当于标准定义隔离级别中的READ UNCOMMITTED(未提交读)。

MySQL支持标准定义的四种隔离级别,默认的隔离级别为REPEATABLE  READ(重复度),但是与标准SQL不同的是,MySQL的InnoDB存储引擎在REPEATABLE READ的隔离级别下,使用Next-Key  Lock(锁定一个范围,并锁定记录本身),因此避免幻读的产生。所以说InnoDB存储引擎在REPEATABLE  READ的隔离级别下已经能保证事务的隔离性要求,即达到SQL标准的SERIALIZABLE隔离级别。

Oracle数据库支持READ COMMITTED(提交读)和SERIALIZABLE这两种事务隔离级别。默认的隔离级别是READ  COMMITTED(提交读)。

二、锁

事务隔离级别是并发控制的整体解决方案,其实际上是综合利用各种类型的锁和行版本控制来解决并发问题。

这里我们主要看数据库中的基本锁。

1、锁的类型

  • S-LOCK:共享锁。又叫读锁,当用户要进行数据的读取时,对数据加上共享锁。共享锁可以同时加多个;

  • X-LOCK:排他锁。又叫写锁。SQL  INSERT/UPDATE/DELETE语句执行时会上X-LOCK。排他锁只可以加一个,和其他的排他锁共享锁都相斥;

  • U-LOCK:修改锁。CURSOR SELECT 有UPDATE OF 子句时,FETCH时对读出的记录,会上U-LOCK。

DB2、MySQL、Oracle都支持S-LOCK和X-LOCK,DB2还支持U-LOCK。

2、事务隔离级别中读数据时的锁类型

如上,数据库在各种隔离级别下,SQL执行INSERT/UPDATE/DELETE语句时都会上X-LOCK,那么在读数据时如何上锁呢?

DB2和MySQL在Uncommitted Read隔离级别下,不加任何锁。

1)DB2

DB2在另外三种CS、RR、RS隔离级别时,SELECT语句,或CURSOR SELECT无UPDATE  OF子句,FETCH时对读出的记录会上S-LOCK,不同的是,CS在读取下一行数据时就释放上一行的锁,RR、RS在事务提交时才释放锁;SELET…FOR  UPDATE对读取的数据都是加U锁,CS在读取下一行数据时就释放上一行的锁,RR、RS在事务提交时才释放锁;INSERT/UPDATE/DELETE语句执行时会上X-LOCK,CS、RR、RS都是在事务提交时才释放X锁,其他事务不能对已锁定的行加任何锁。

2)MySQL

MySQL的InnoDB在隔离级别READ COMMITED 和 REPEATABLE  READ(MySQL的默认隔离级别)下SELECT时不上锁,即MySQL中的一致性非锁定读;只有指定SELECT…LOCK IN SHARE  MOAD才对记录上S-LOCK,SERIALIZABLE隔离级别下SELECT对记录上S-LOCK;三种隔离级别下,SELET…FOR  UPDATE对读取的数据都是加X锁,在MySQL中叫做一致性锁定读。

3)Oracle

Oracle中只支持READ COMMITED和SERIALIZABLE隔离级别。这两种隔离级别下的锁机制和InnoDB一致。Oracle中不需要READ  UNCOMMITTED隔离级别,是因为READ UNCOMMITTED主要功能是提高只读时的并发性,而Oracle在READ  COMMITED隔离级别下使用一致性非锁定读也有同样的功能。

3、一致性非锁定读

隔离级别READ COMMITED 和 REPEATABLE READ(MySQL的默认隔离级别)都使用一致性非锁定读,  SELECT时不上锁,那么如何保证事务的隔离性呢?这两种隔离级别采用快照数据的方式保证隔离性。读取时对于上了X锁的数据,都会去读取行的一个快照数据。快照数据是指该行的之前版本的数据,通过undo段实现。而undo段用来在事务中回滚数据,因此快照数据本身没有额外的开销。

READ COMMITED 和 REPEATABLE  READ两种隔离级别在读快照数据时的区别是,RC总是读取最新的快照数据,所以可能会发生不可重复读,即第二次读取的数据和第一次不一致;而RR总是读取事务开始时的快照,所以不会发生不可重复度。

非锁定读机制不会等待行上X锁的释放,极大的提高了数据库的并发性。是InnoDB的默认读取方式。

三、小结

并发控制在保证数据一致性的前提下提供最大的并发性,而保证数据一致性的前提就是保证事务的隔离性,事务的隔离性和并发性是成反比的,隔离级别越高,并发性越低。所以程序要视并发性和隔离性的轻重选择隔离级别。

到此,关于“Oracle、MySQL、DB2并发控制机制的异同是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

您可能感兴趣的文档:

--结束END--

本文标题: Oracle、MySQL、DB2并发控制机制的异同是什么

本文链接: https://www.lsjlt.com/news/57805.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Oracle、MySQL、DB2并发控制机制的异同是什么
    这篇文章主要介绍“Oracle、MySQL、DB2并发控制机制的异同是什么”,在日常操作中,相信很多人在Oracle、MySQL、DB2并发控制机制的异同是什么问题上存在疑惑,小编查阅了各式资料,整理出简单...
    99+
    2024-04-02
  • MongoDB的并发控制与锁机制是什么
    MongoDB使用乐观并发控制(Optimistic Concurrency Control)来处理并发操作。在MongoDB中,并...
    99+
    2024-05-07
    MongoDB
  • mysql中并发控制的原理是什么
    mysql中并发控制的原理是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1、mysql的逻辑框架mysql逻辑框架图如下:最上层是处...
    99+
    2024-04-02
  • 掌控MySQL并发:深度解析锁机制与并发控制
    前一篇MySQL读取的记录和我想象的不一致——事物隔离级别和MVCC 讲了事务在并发执行时可能引发的一致性问题的各种现象。一般分为下面3种情况: 读 - 读情况:并发事务相继读取相同的记录。读取...
    99+
    2023-09-18
    MySQL并发控制 隐式锁 插入意向锁 行锁 表锁
  • golang并发控制的方法是什么
    在Go语言中,可以使用以下几种方法来控制并发:1. Goroutine:Goroutine是Go语言中的轻量级线程,可以通过go关键...
    99+
    2023-10-20
    golang
  • NoSQL中乐观并发控制和悲观并发控制的区别是什么
    在NoSQL数据库中,乐观并发控制和悲观并发控制是两种常见的并发控制策略。 乐观并发控制: 乐观并发控制假设冲突的概率较低,并...
    99+
    2024-05-07
    NoSQL
  • 什么是Java中的Git并发控制?
    Java中的Git并发控制是一种用于管理软件开发过程中多人同时修改同一代码库的机制。该机制确保在多人同时进行代码修改时,不会发生冲突和数据丢失。 Git是一种分布式版本控制系统,它允许多人同时对代码库进行修改,但这种并发修改可能会导致冲突和...
    99+
    2023-10-16
    git django 并发
  • MySQL多版本并发控制机制源码分析
    本篇内容主要讲解“MySQL多版本并发控制机制源码分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL多版本并发控制机制源码分析”吧!MVCC(多版本并...
    99+
    2024-04-02
  • golang控制并发数的方法是什么
    在Golang中,可以使用goroutine和channel来控制并发数。以下是几种常见的方法: 通过控制goroutine的数...
    99+
    2023-10-27
    golang
  • C#并发编程和线程同步机制是什么
    C#并发编程是指在C#程序中同时执行多个任务的能力。线程同步机制是确保多个线程能够安全地访问共享资源的方法。在C#中,线程同步可以通...
    99+
    2024-03-07
    C#
  • golang控制并发数量的方法是什么
    在golang中,可以使用goroutine和channel来控制并发数量。以下是一些常用的方法: 使用goroutine和Wai...
    99+
    2023-10-21
    golang
  • DB2中怎么处理并发访问和事务控制
    在DB2中处理并发访问和事务控制通常涉及以下几个方面: 锁定机制:DB2提供了不同的锁定级别,包括共享锁和排他锁。通过使用锁定机...
    99+
    2024-03-07
    DB2
  • MySQL的多版本并发控制MVCC实现方法是什么
    这篇文章主要讲解了“MySQL的多版本并发控制MVCC实现方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL的多版本并发控制MVCC实现方法是什么”吧!什么是MVCCMVCC...
    99+
    2023-06-22
  • MySQL中怎么实现并发控制
    今天就跟大家聊聊有关MySQL中怎么实现并发控制,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。锁锁分为读锁和写锁两种,也称作共享锁和排他锁。因为多个...
    99+
    2024-04-02
  • Golang常用的并发控制机制有哪些
    Goroutines:Goroutines 是 Golang 中的轻量级线程,可以并发地执行函数或方法。 Channels:...
    99+
    2024-03-13
    Golang
  • MySQL 并发控制中的锁策略
    MySQL 锁的并发控制策略引言:在数据库系统中,为了保证数据的一致性和完整性,需要对并发操作进行控制。而锁机制是一种常用的并发控制策略。MySQL作为一种常用的关系数据库管理系统,也拥有自己的锁机制,下面我们就来详细了解MySQL锁的并发...
    99+
    2023-12-21
    并发 策略
  • Oracle的安全审计和访问控制机制是什么
    Oracle的安全审计和访问控制机制主要包括以下几个方面: 安全审计:Oracle数据库提供了丰富的审计功能,可以对数据库的操作...
    99+
    2024-04-09
    Oracle
  • golang函数并发控制与WebAssembly的协同
    是的,将 go 函数并发控制与 webassembly 协同使用可以提高 web 应用程序的性能和可扩展性。具体来说,这种协同具有以下优势:并行执行:通过 go goroutine 并行...
    99+
    2024-04-24
    并发控制 golang 跨平台应用
  • java高并发处理机制是什么
    Java高并发处理机制是指通过使用多线程、线程池、锁、同步机制等技术来提高Java程序的并发处理能力。在Java中,可以通过以下几种...
    99+
    2023-10-11
    java
  • Spring框架中的并发控制机制有哪些?
    Spring框架是Java应用程序开发中非常常用的框架之一。在现代应用程序中,多线程和并发控制是必不可少的。在本文中,我们将探讨Spring框架中的并发控制机制。 Synchronized关键字 Synchronized关键字是Java...
    99+
    2023-07-20
    并发 spring 日志
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作