数据库隔离级别理解「建议收藏」

数据库隔离级别理解「建议收藏」1.为什么要选择隔离级别?通过例子说明隔离级别的必要性:假设一个场景,一对夫妻共用一个账户,妻子喜欢网上支付,丈夫喜欢刷卡支付。第一类丢失情况:整个过程中只有老公消费1000元,而最后时刻,老婆回滚事务,恢复到了原来的10000元,这不符合实际。这样的两个事务并发,一个提交,一个回滚导致的不一致成为第一类丢失更新,不过大部分数据库(mysql,o…

大家好,又见面了,我是你们的朋友全栈君。

1.为什么要选择隔离级别?

     通过例子说明隔离级别的必要性:

      假设一个场景,一对夫妻共用一个账户,妻子喜欢网上支付,丈夫喜欢刷卡支付。

第一类丢失情况:

数据库隔离级别理解「建议收藏」

     整个过程中只有老公消费1000元,而最后时刻,老婆回滚事务,恢复到了原来的10000元,这不符合实际。这样的两个事务并发,一个提交,一个回滚导致的不一致成为第一类丢失更新,不过大部分数据库(mysql,oracle)基本上消灭了这类丢失更新,所以不做过多的阐述。

第二类丢失情况:

 

数据库隔离级别理解「建议收藏」

   整个过程存在两处交易,老公消费1000元,老婆消费1000元,余额应该是8000元,但这里结果却是9000元,显然不符合常理。这是因为两个事务都提交了,在不同的事务中,无法探知其他事务的的操作导致的,

通过上边2中情况,可知隔离级别的重要性。

2.什么是隔离级别?

隔离级别为了克服事务之间协助的一致性,数据库标准规范中定义了事务之间的隔离级别,来在不同的程度上减少出现丢失更新的可能性。

3.隔离级别有哪些?

       1>.脏读

 在脏读级别中,一个事务可以读取到另一个事务未提交的数据

数据库隔离级别理解「建议收藏」

由于设置隔离级别为脏读,所以事务一和事务二可以相互读取数据。

在上面的情况中事务一在提交的时候读取到事务二未提交的数据,事务一提交后的结果为8000

后面事务二回滚,读取到了事务一提交的数据8000,所以回滚事务为8000.

这也是不符合常理的

        2>.读/写提交

在读/写提交中,事务之间只能读取到已经提交的数据。

数据库隔离级别理解「建议收藏」

       设置 隔离级别为读/写提交。事务一在提交的时候读取不到事务二未提交的数据,所以提交事务后余额为9000

    事务二在回滚的时候可以读取到事务一提交的时候,回滚结果为9000,符合常理。

        3>.可重复读

即可以重复读取数据。为了保证数据的一致性。

  数据库隔离级别理解「建议收藏」

       在事务一提交之前,事务二花了9000元并且已经提交事务。但是对于事务一来说,他在读取的时候是10000元。但是当他结账的时候余额已经变成了1000元,但是他并没有显示。老公也并不知道自己的余额不足,导致他在结账的时候(提交)由于可以读取到事务二已经提交的数据,发现自己余额不足,很尴尬。

为了避免这种尴尬,可重复读隔离级别就出现了,它可以重复的读取。

可重复读是针对于同一条数据而言的,当同一条数据在读/写提交后,他会去重复读取,从而保证数据的一致性。

这样老公在结账的时候就会看到自己的余额为1000,而不是在提交事务的时候才发现自己余额不足。

       4>.序列化

序列化是为了消除幻读而制定的规则,它是一种让SQL按照顺序读写的方式。

数据库隔离级别理解「建议收藏」

老婆在查询消费记录的时候查到了10条,但当打印的时候打印出来11条,在这期间他并不知道老公消费了,他会认为这一条是错误打印,虚幻出来的。

采用幻读后,老婆查询出来的数据不会包含老公刚刚消费的。

4.各类隔离级别和产生的现象

数据库隔离级别理解「建议收藏」

5.怎样选择隔离级别

   在应用的时候,不单单要考虑数据的一致性,还要考虑系统的性能,从脏读到序列化,性能直线下降。采用更高的隔离级别,会严重压制发,导致大量线程挂起,知道获取锁才能进行下一步操作,而恢复时有需要大量的等待时间。

  如果并发量比较大的话一般采用读/写提交,但在并发性很小甚至可以忽略的时候,一般采用序列化。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/141106.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • divmod的使用[通俗易懂]

    divmod的使用[通俗易懂]今天在学习pandas的官方文档时,遇到了divmod这个函数,调用了help(divmod)。pandas返回了一行话如下:divmod(x,y,/)Returnthetuple(x//y,x%y).#即x//y返回的是x除以y以后的整数部分,#x%y返回的是x除以y后的余数部分下面看一下,其在pandas中是如何使用的:>>>s=pd.Series(np.arange(10))>>>s001

    2025年7月22日
    4
  • 基于java的酒店管理系统的设计与实现_java酒店管理系统源码

    基于java的酒店管理系统的设计与实现_java酒店管理系统源码前言:项目是使用Javaswing开发,可实现基础数据维护用户登录、系统首页酒店信息管理、主要模块是开房管理、退房管理、房间信息管理、顾客信息管理等功能。界面设计比较简介、适合作为Java课设设计以及学习技术使用。引言在信息高度发达的今天,酒店业务涉及的各个工作环节已不再仅仅是传统的住宿、结算业务,而是更广、更全面的服务性行业代表。酒店宾馆作为一个服务性行业,从客房的营销即客人的预定开始,到入住登记直到最后退房结账,整个过程应该能够体现以宾客为…

    2022年9月24日
    4
  • MATLAB的solve函数

    MATLAB的solve函数solve函数可以进行以下情况的求解:(1)等式:单/多变量+线性/非线性;(2)不等式MATLAB方程组、不等式求解。

    2022年7月17日
    18
  • IC卡、ID卡及车库蓝牙卡的复制说明!(小区的门禁系统)[通俗易懂]

    IC卡、ID卡及车库蓝牙卡的复制说明!(小区的门禁系统)[通俗易懂]IC卡、ID卡及车库蓝牙卡的复制说明!(小区的门禁系统)

    2022年5月29日
    136
  • onedrive自动同步_onedrive没有同步

    onedrive自动同步_onedrive没有同步Zotero管理文献时,经常需要同步不同设备的文献到Zotero云端以保持版本统一,但是Zotero提供的免费空间不够用来同步大量pdf附件。这时,可以使用第三方云平台来实现同步,比如坚果云,onedrive等。这里,我用onedrive来存储Zotero的pdf文件。………

    2025年10月10日
    1
  • axon-saga

    axon-saga管理复杂的业务事务并不是每个命令都能够在单个ACID事务中完全执行。银行转帐是一个很常见的例子,常常作为他们的论据。人们经常认为,将资金从一个账户转移到另一个账户的交易绝对需要原子性和一致性。其实呢,不是的这样的。相反,这是不可能的。如果钱从A银行的账户转移到B银行的另一个账户?A银行是否须要锁定B银行数据库?如果转账正在进行中,银行A已经扣除了这笔款项,但银行B还没有存入该钱,这有点奇怪?事…

    2022年9月19日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号