首页 > 编程知识 正文

mysql事务隔离级别有哪些,mysql事务隔离级别面试题

时间:2023-05-06 08:13:31 阅读:182033 作者:2802

隔离级别MySQL是一种服务器/客户端体系结构软件,当多个客户端连接到同一台服务器且每个客户端连接到服务器时,称为会话(Session )。 我们可以同时在不同的对话中输入各种各样的句子。 这些语句可以作为事务的一部分处理。 不同的会话可以同时发送请求。 这意味着服务器可能同时处理多个事务,结果是不同的事务可能同时访问同一条记录。 虽然您已经描述了事务的一个称为隔离的特性,但是理论上,当一个事务访问某个数据时,其他事务将排队,直到事务提交,其他事务都将保留在该数据中但是,这样下去对性能的影响太大了,设计数据库的大叔为了最大限度地提高系统同时处理事务的能力,提出了各种各样的隔离级别,但这也是以一定的隔离性为代价达到的。

33558 www.Sina.com/(只读)脏读

如果一个事务读取另一个未提交事务更改的数据,则此隔离级别称为未提交读(READ UNCOMMITTED ),如下所示:

如上图所示,Session A和Session B分别打开了一个事务。 Session B的事务首先将id1中记录的列c更新为“关羽”,然后Session A的事务查询此id1中的记录,在未提交的隔离级别,查询结果为“关羽” 这意味着一个事务读取了另一条记录。但是,如果Session B事务稍后回滚,则Session A事务读取了不存在的数据。 这种现象称为脏读。 像这样:

由于脏读与现实世界中的业务含义相悖,因此此读合并是一个非常不安全的隔离级别。

33558 www.Sina.com/(读已提交)不能重复阅读

如果事务只能读取由另一个提交的事务更改的数据,并且每次其他事务更改和提交数据时,事务都可以查询最新的值,则此隔离级别是提交的读取(英文名称: read CCD ) 如图所示,如下所示。

从图中可以看到,在步骤4时,由于会话b的事务尚未提交,所以会话a的事务查询的结果仅为"刘备",在步骤6时,会话b的事务被提交

对于已提交的具有读取隔离级别的事务,在其他事务更改并提交数据值后,事务将读取最新的数据值。 例如,以下内容:

在Session B上提交了一些隐式事务。 这些事务可以更改id为1的记录中列c的值,并且每次提交事务时,Session A中的事务都会显示最新的值。 这种现象也被称为无法重复阅读。

33558 www.Sina.com/(repeatable read ) mysql的缺省隔离级别

在某些业务场景中,事务只能读取已提交的另一个事务更改的数据。 但是,如果第一次读取一条记录,而另一个事务更改了该记录的值并提交了它,则在事务后重新读取该记录时,将读取第一个读取的值,而不是每次读取不同的数据。 如图所示,这种隔离级别称为可重复读取(英文名: REPEATABLE READ )。

从图中可以看到,Session A的事务,最初读取id为1的记录时,列c的值为“刘备”,然后,多个事务隐含地提交给Session B,各事务保存该记录

未提交读

如果一个事务首先根据某个条件检索一些记录,然后另一个事务将满足这些条件的记录插入表中,则在原始事务再次根据该条件检索时,将插入另一个事务图像如下所示。

如上图所示,Session A的事务首先基于条件number 0调查表hero,得到了name列的值为“刘备”的记录; 然后,向Session B提交了一个隐式事务,并在表hero中插入了一条新记录。 之后,Session A的事务在相同条件下向number 0查询表hero,得到的结果集中包含Session B的事务新插入的记录的现象也称为幻读。

有些同学会有疑问,如果不是在Session B中插入新的记录,而是删除了符合number 0的记录,那么Session A之后根据number 0的条件读取的记录就越来越少了,这不是幻觉吧。 说白了,这种现象不是幻读。 幻读强调在某种相同条件下多次读取记录时,后来读取时读取了之前没有读取的记录。

已提交读

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