Java语言】什么是事务的隔离级别?

2020-12-29 14:03发布

16条回答
Sophia
2楼 · 2020-12-29 19:55

为了避免上面出现的几种情况,在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同。

未授权读取(Read Uncommitted):允许脏读取,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个数据则不允许同时进行写操作,但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。

授权读取(Read Committed):允许不可重复读取,但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。

可重复读取(Repeatable Read):禁止不可重复读取和脏读取,但是有时可能出现幻影数据。这可以通过“共享读锁”和“排他写锁”实现。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。

序列化(Serializable):提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。

隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed,它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、虚读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。


为了避免上面出现的几种情况,在标准SQL规范中,定义了4个事bai务隔离级别,不同的隔离级别对事务的处理不同。

● 未授权读取(Read Uncommitted):允许脏读取,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个数据则不允许同时进行写操作,但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。

● 授权读取(Read Committed):允许不可重复读取,但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。

● 可重复读取(Repeatable Read):禁止不可重复读取和脏读取,但是有时可能出现幻影数据。这可以通过“共享读锁”和“排他写锁”实现。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。

● 序列化(Serializable):提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。

隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed,它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、虚读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。


武新雨 - 一个很酷的人。
4楼 · 2020-12-30 08:53

说到事务,不得不提的就是ACID特性,再次回顾:

  Ø  原子性(atomicity):组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分。

  Ø  一致性(consistency):在事务处理执行前后,数据库是一致的(数据库数据完整性约束)。

  Ø  隔离性(isolcation):一个事务处理对另一个事务处理的影响。

  Ø  持续性(durability):事务处理的效果能够被永久保存下来 。

为了应对多线程并发读取数据时出现的问题,事务有了“隔离级别”特性,多线程并发读取数据一般会引发如下三个问题

  Ø  脏读(dirtyreads)

  Ø  不可重复读(non-repeatablereads)

  Ø  幻读(phantomread)

下面进行简要介绍:

  Ø  脏读:一个事务读取了另一个未提交的并行事务写的数据。

  Ø  不可重复读:一个事务重新读取前面读取过的数据, 发现该数据已经被另一个已提交的事务修改过。

  Ø  幻读:一个事务重新执行一个查询,返回一套符合查询条件的行, 发现这些行因为其他最近提交的事务而发生了改变。

2)       为了处理上面的读数据问题,java事务提供了4种隔离级别,如下:

  Ø  读未提交(Read uncommitted)

  Ø  读已提交(Readcommitted)

  Ø  可重复读(Repeatableread)

  Ø  可串行化(Serializable)


像风没有归宿
5楼 · 2020-12-30 09:50

数据库系统必须具有隔离并发运行各个事务的能力,是它们之间相互不影响,避免了各种并发问题。一个事务与其他事务隔离的程度为隔离级别。(也就是相互之间影响的影响的程度导致隔离级别,影响程度越小,那么就说明隔离级别越大)。SQL标准中规定了多种事务的隔离级别,不同的隔离级别分别对应着不同的干扰程度,隔离级别越高,数据一致性就越好,但是并发性越弱。

啦啦啦
6楼 · 2020-12-30 10:16

在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同。

未授权读取(Read Uncommitted):允许脏读取,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个数据则不允许同时进行写操作,但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。

授权读取(Read Committed):允许不可重复读取,但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。

可重复读取(Repeatable Read):禁止不可重复读取和脏读取,但是有时可能出现幻影数据。这可以通过“共享读锁”和“排他写锁”实现。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。

序列化(Serializable):提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。

隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed,它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、虚读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。


浅浅77
7楼 · 2020-12-30 10:26

这其实也是事务的一大特性有关系,事务的隔离性。

隔离性,就是在多个事务间会出现一个异常情况,那么针对这些异常情况,我们需要有不同的处理结论,但是不同的处理结论肯定导致的性能方面会有不一样的结果。

是你的小甜心呀
8楼 · 2020-12-30 15:15

什么是事务。

事务主要是逻辑上的一组操作,主要是对数据库 i读/o写的操作,或是对数据库增删改查的操作。

事务的4个特性:

原子性:事务中的操作,要么全做成,要么都不做,事务是不可拆分的,事务必须是以commit和rollback结束。

一致性:事务执行的结果,必须是使数据库数据从一个一致性状态变到另外一种一致性状态。

隔离性:多个事务之间,互相不干扰,不会影响事务的执行。

持久性:一旦事务成功完成,commit它对数据库的更新操作是永久持久的,数据不会发生改变。

事务的状态:

1. 活动状态
事务在执行时的状态叫活动状态。
2. 部分提交状态
事务中最后一条语句被执行后的状态叫部分提交状态。
3. 失败状态
事务不能正常执行的状态叫失败状态。
4. 提交状态
事务在部分提交后,将往硬盘上写入数据,当最后一条信息写入后的状态叫提交状态。进入提交状态的事务就成功完成了。
5. 中止状态
事务回滚并且数据库已经恢复到事务开始执行前的状态叫中止状态。

事务的隔离级别

 事务的隔离级别也分为四种,由低到高依次分别为:read uncommited(读未提交)、read commited(读提交)、read repeatable(读重复)、serializable(序列化),这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。

  1. read uncommited:是最低的事务隔离级别,它允许另外一个事务可以看到这个事务未提交的数据。出现(脏读,不可重复读,幻读)

  2. read commited:保证一个事物提交后才能被另外一个事务读取。另外一个事务不能读取该事物未提交的数据。出现(不可重复读,幻读)

  3. repeatable read:这种事务隔离级别可以防止脏读,不可重复读。但是可能会出现幻象读。它除了保证一个事务不能被另外一个事务读取未提交的数据之外还避免了以下情况产生(不可重复读)。出现(幻读)

  4. serializable:这是花费最高代价但最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读之外,还避免了幻象读。

脏读、不可重复读、幻象读概念说明:

       1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据

  2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。

  3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。


我是大脸猫
9楼 · 2020-12-30 15:27

什么是事务。

事务主要是逻辑上的一组操作,主要是对数据库 i读/o写的操作,或是对数据库增删改查的操作。

事务的4个特性:

原子性:事务中的操作,要么全做成,要么都不做,事务是不可拆分的,事务必须是以commit和rollback结束。

一致性:事务执行的结果,必须是使数据库数据从一个一致性状态变到另外一种一致性状态。

隔离性:多个事务之间,互相不干扰,不会影响事务的执行。

持久性:一旦事务成功完成,commit它对数据库的更新操作是永久持久的,数据不会发生改变。

事务的状态:

1. 活动状态
事务在执行时的状态叫活动状态。
2. 部分提交状态
事务中最后一条语句被执行后的状态叫部分提交状态。
3. 失败状态
事务不能正常执行的状态叫失败状态。
4. 提交状态
事务在部分提交后,将往硬盘上写入数据,当最后一条信息写入后的状态叫提交状态。进入提交状态的事务就成功完成了。
5. 中止状态
事务回滚并且数据库已经恢复到事务开始执行前的状态叫中止状态。

事务的隔离级别

 事务的隔离级别也分为四种,由低到高依次分别为:read uncommited(读未提交)、read commited(读提交)、read repeatable(读重复)、serializable(序列化),这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。

  1. read uncommited:是最低的事务隔离级别,它允许另外一个事务可以看到这个事务未提交的数据。出现(脏读,不可重复读,幻读)

  2. read commited:保证一个事物提交后才能被另外一个事务读取。另外一个事务不能读取该事物未提交的数据。出现(不可重复读,幻读)

  3. repeatable read:这种事务隔离级别可以防止脏读,不可重复读。但是可能会出现幻象读。它除了保证一个事务不能被另外一个事务读取未提交的数据之外还避免了以下情况产生(不可重复读)。出现(幻读)

  4. serializable:这是花费最高代价但最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读之外,还避免了幻象读。

脏读、不可重复读、幻象读概念说明:

       1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据

  2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。

  3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

  小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表


相关问题推荐

  • 回答 7
    已采纳

    里氏代换原则(Liskov Substitution Principle, LSP):所有引用基类(父类)的地方必须能透明地使用其子类的对象里氏代换原则告诉我们,在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实体使用的是一...

  • 回答 8
    已采纳

    心里有个预期,然后看看是以什么目的进这家企业工作,要是赚钱的话,那就多要点,要是学习的话,可以根据情况要一个能养活自己的价格。

  • 回答 4
    已采纳

    Java中有八种数据类型,基础数据类型分别是:byte,short,int,long,float,double,char,boolean,引用数据类型分别是:数组,类和接口。方法传参的时候我们有两种,一种是形式参数(定义方法时写的参数),一种是实际参数(调用方法时给的具体值)。首先...

  • 回答 15
    已采纳

    现在的架构很多,各种各样的,如高并发架构、异地多活架构、容器化架构、微服务架构、高可用架构、弹性化架构等,还有和这些架构相关的管理型的技术方法,如 DevOps、应用监控、自动化运维、SOA 服务治理、去 IOE 等等,还有很多。分布式架构其实就是分布式系...

  • 回答 10

    1、监控GC的状态使用各种JVM工具,查看当前日志,分析JVM参数的设置,分析堆内存快照和GC日志,根据实际的各区域的内存划分和GC的执行时间,判断是否需要进行优化2、分析结果、判断是否需要优化如果各项参数设置合理,系统没有超时的日志出现,GC频率也不高,...

  • 回答 6

    MyBatis 每次创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成。 默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认构造方法,要么在参数映射存在的时候通过参数构造方法来实例化。 如果想覆盖对象工厂的默认行为,则可以...

  • 回答 6

    学vue应该要先学习javascript 的基础知识和用法。

  • 回答 8

    1、lambda是jdk8的新特性2、使用lambda的前提,必须是一个接口,接口只能有一个抽象方法3、Lambda 表达式的简单例子:// 1. 不需要参数,返回值为 5  () -> 5    // 2. 接收一个参数(数字类型),返回其2倍的值  x -> 2 * x    // 3. 接受2个参数(数...

  • 回答 9

    Redis是一种高级key-value数据库。它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富。有字符串,链表,集 合和有序集合。支持在服务器端计算集合的并,交和补集(difference)等,还支持多种排序功能。所以Redis也可以被看成是一个数据结构服...

  • 回答 7

            视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。        对其中...

  • 回答 6

    1.索引是什么?索引就像是一本书的目录,假设我们想要在书中找到某一小节的内容,如果没有目录,我们是不是要从头到尾顺序找一遍,这非常浪费时间,但有了目录,我们就可以快速定位到该小节的页码,并找到该小结的内容。索引的作用就是这样,可以帮助我们快速...

  • 回答 1

    有很大的实用性5G技术是一种比4G技术提升了近100倍,理论下载速率达到了10Gbps,而实际下载速率一般不超过5Gbps。但是,这也已经很快了,一部电影一秒钟就下载完了!根据普通人而言,在5G的时代,可以得到更好的发展,其实大可以围绕快这一个字来做文章。因为...

  • 回答 3

    没有说哪个好~Java和Python就是两个不同的语言,各有各的有点,后期发展也都是差不多的,只不过看个人的兴趣,Python比Java更吃学历。

  • 回答 1

    access中的窗体对象是用户和数据库系统进行人机交互的界面。

没有解决我的问题,去提问