事务隔离级别是什么

事务隔离级别是什么,第1张

事务隔离级别是为了保证并发读取数据库中数据正确性而采用的一种策略。

事务隔离级别包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。

事务的隔离级别有四种级别,读取未提交内容,在该隔离级别,所有事务都可以看到其他未提交事务的执行结果、读取提交内容,这是大多数数据库系统的默认隔离级别。

可重读,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行、可串行化,这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突。

事务隔离的解决方法:

1、未授权读取的方法,也称为读未提交。该隔离级别可以通过“排他写锁”实现。

2、授权读取的方法,可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。

3、可重复读取,通过“共享读锁”和“排他写锁”实现。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。

4、序列化的方式。它要求事务序列化执行,事务只能一个接着一个地执行,不能并发执行。

百度百科-事务隔离级别

我们设想一个场景,这个场景中我们需要插入多条相关联的数据到数据库,不幸的是,这个过程可能会遇到下面这些问题:

上面的任何一个问题都可能会导致数据的不一致性。为了保证数据的一致性,系统必须能够处理这些问题。事务就是我们抽象出来简化这些问题的首选机制。事务的概念起源于数据库,目前,已经成为一个比较广泛的概念。

何为事务? 一言蔽之, 事务是逻辑上的一组 *** 作,要么都执行,要么都不执行。

事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账 1000 元,这个转账会涉及到两个关键 *** 作,这两个 *** 作必须都成功或者都失败。

事务会把这两个 *** 作就可以看成逻辑上的一个整体,这个整体包含的 *** 作要么都成功,要么都要失败。这样就不会出现小明余额减少而小红的余额却并没有增加的情况。

大多数情况下,我们在谈论事务的时候,如果没有特指 分布式事务 ,往往指的就是 数据库事务

数据库事务在我们日常开发中接触的最多了。如果你的项目属于单体架构的话,你接触到的往往就是数据库事务了。

那数据库事务有什么作用呢?

简单来说,数据库事务可以保证多个对数据库的 *** 作(也就是 SQL 语句)构成一个逻辑上的整体。构成这个逻辑上的整体的这些数据库 *** 作遵循: 要么全部执行成功,要么全部不执行

另外,关系型数据库(例如: MySQL 、 SQL Server 、 Oracle 等)事务都有 ACID 特性:

ACID

这里要额外补充一点: 只有保证了事务的持久性、原子性、隔离性之后,一致性才能得到保障。也就是说 A、I、D 是手段,C 是目的!

在典型的应用程序中,多个事务并发运行,经常会 *** 作相同的数据来完成各自的任务(多个用户对同一数据进行 *** 作)。并发虽然是必须的,但可能会导致以下的问题。

不可重复读和幻读区别 :不可重复读的重点是修改比如多次读取一条记录发现其中某些列的值被修改,幻读的重点在于新增或者删除比如多次查询同一条查询语句(DQL)时,记录发现记录增多或减少了。

SQL 标准定义了四个隔离级别:

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

MySQL 的隔离级别基于锁和 MVCC 机制共同实现的。

SERIALIZABLE 隔离级别,是通过锁来实现的。除了 SERIALIZABLE 隔离级别,其他的隔离级别都是基于 MVCC 实现。

不过, SERIALIZABLE 之外的其他隔离级别可能也需要用到锁机制,就比如 REPEATABLE-READ 在当前读情况下需要使用加锁读来保证不会出现幻读。

MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读) 。我们可以通过 SELECT @@tx_isolation; 命令来查看,MySQL 80 该命令改为 SELECT @@transaction_isolation;

从上面对 SQL 标准定义了四个隔离级别的介绍可以看出,标准的 SQL 隔离级别定义里,REPEATABLE-READ(可重复读)是不可以防止幻读的。

但是!InnoDB 实现的 REPEATABLE-READ 隔离级别其实是可以解决幻读问题发生的,主要有下面两种情况:

因为隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是 READ-COMMITTED ,但是你要知道的是 InnoDB 存储引擎默认使用 REPEATABLE-READ 并不会有任何性能损失。

InnoDB 存储引擎在分布式事务的情况下一般会用到 SERIALIZABLE 隔离级别。

对于同时运行的多个事务, 当这些事务访问数据库中相同的数据时, 如果没有采取必要的隔离机制, 就会导致各种并发问题:

• 脏读: 对于两个事物 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段 之后, 若 T2 回滚, T1读取的内容就是临时且无效的

• 不可重复读: 对于两个事物 T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段 之后, T1再次读取同一个字段, 值就不同了

• 幻读: 对于两个事物 T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的行 之后, 如果 T1 再次读取同一个表, 就会多出几行

数据库事务的隔离性: 数据库系统必须具有隔离并发运行各个事务的能力, 使它们不会相互影响, 避免各种并发问题

一个事务与其他事务隔离的程度称为隔离级别 数据库规定了多种事务隔离级别, 不同隔离级别对应不同的干扰程度, 隔离级别越高, 数据一致性就越好, 但并发性越弱

数据库提供了4中隔离级别:

隔离级别 描述

READ UNCOMMITTED(读未提交数据) 允许事务读取未被其他事务提交的变更,脏读、不可重复读和幻读的问题都会出现

READ COMMITED(读已提交数据) 只允许事务读取已经被其他事务提交的变更,可以避免脏读,但不可重复读和幻读问题仍然会出现

REPEATABLE READ(可重复读) 确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新,可以避免脏读和不可重复读,但幻读的问题依然存在

SERIALIZABLE(串行化) 确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入、更新和删除 *** 作,所有并发问题都可以避免,但性能十分低

Oracle 支持的 2 种事务隔离级别:READ COMMITED, SERIALIZABLE Oracle 默认的事务隔离级别为: READ COMMITED

Mysql 支持 4 中事务隔离级别 Mysql 默认的事务隔离级别为: REPEATABLE READ

1查看当前会话隔离级别

select @@tx_isolation;

2查看系统当前隔离级别

select @@globaltx_isolation;

3设置当前会话隔离级别

set session transaction isolatin level repeatable read;

4设置系统当前隔离级别

set global transaction isolation level repeatable read;

5命令行,开始事务时

set autocommit=off 或者 start transaction

关于隔离级别的理解

1read uncommitted

可以看到未提交的数据(脏读),举个例子:别人说的话你都相信了,但是可能他只是说说,并不实际做。

2read committed

读取提交的数据。但是,可能多次读取的数据结果不一致(不可重复读,幻读)。用读写的观点就是:读取的行数据,可以写。

3repeatable read(MySQL默认隔离级别)

可以重复读取,但有幻读。读写观点:读取的数据行不可写,但是可以往表中新增数据。在MySQL中,其他事务新增的数据,看不到,不会产生幻读。采用多版本并发控制(MVCC)机制解决幻读问题。

4serializable

可读,不可写。像java中的锁,写数据必须等待另一个事务结束。

事务隔离级别可以理解为锁定正在被某个事务所占用的资源以减少其他事务对这些数据库资源的影响,保证数据的一致性。在多用户系统中,经常出现多个事务同时需要 *** 作某一个数据库中的数据的情况,为了防止事务之间的相互影响,提高数据库数据的安全性和完整性,数据库系统提供了隔离机制。

隔离级别就是一个事务必须和其他事务隔离的程度,包括未提交读(ReadUncommitted)、提交读(ReadCommitted)、可重复读(RepeatableRead)、可串行化(Serializable)四个级别。

1未提交读未提交读是最低的事务隔离,仅保证不读取物理损坏的数据。

2提交读提交读比未提交读隔离级别更高一层,提交读隔离级别是大多数主流数据库的默认隔离级别,其保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了“脏读取”的情况发生。

3可重复读可重复读保证了任何情况下,在同一个事务中前后数次所读取的数据是一致的,避免了“不可重复读取”的情况发生,是关系型数据库管理系统(MySQL)的默认隔离级别。

4可串行化可串行化是最高的事务隔离等级,是将数据库中所有事务以串联的方式连接起来,防止一个事务影响其他事务。在此隔离级别,将没有并发事务。

A 、B、C都是错的。

A        read uncommitted 性能最好

B        serializable 安全性最高

C        mysql默认隔离级别:repeatable_read

附上一些概念帮助你理解:

脏读、非重复读、幻像读都是不安全的:

1、脏读(dirty read):一个事务可以读取另一个尚未提交事务的修改数据。

2、非重复读(nonrepeatable read):在同一个事务中,同一个查询在T1时间读取某一行,在T2时间重新读取这一行时候,这一行的数据已经发生修改,可能被更新了(update),也可能被删除了(delete)。

3、幻像读(phantom read):在同一事务中,同一查询多次进行时候,由于其他插入 *** 作(insert)的事务提交,导致每次返回不同的结果集。

提高安全性的另一个方面是牺牲效率。所以效率的排名和安全性倒序

再补充一句查看MYsql的隔离级别:select @@tx_isolation;

以上就是关于事务隔离级别是什么全部的内容,包括:事务隔离级别是什么、MySQL 事务的默认隔离级别是什么可以解决幻读问题么、数据库哪个隔离级别可以实现脏读等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9809268.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存