关于事务的隔离级别和处理机制的理解

关于事务的隔离级别和处理机制的理解

     前几日有一个猎头公司的面试,其中问道我事务隔离这块的知识点,猛一问真是想不起来啊,顿感羞愧啊,回来专门总结一下这方面的知识来夯实一下之前的知识体系,也提醒广大园友们进步在于总结啊,好多不用的知识点,有时候有必要温故知新啊。

简介   

      ACID,是指在可靠数据库管理系统(DBMS)中,事务(transaction)所应该具有的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability).这是可靠数据库所应具备的几个特性.

     我们通过SQL SERVER对数据库进行管理,不可避免要实现多个进程访问数据库同一数据,或者修改同一数据。 这样就不得不提到SQL Server利用加锁和阻塞来保证事务之间不同等级的隔离性,从而实现事务的互不干扰的访问和操作数据库。

     首先我们要知道都有哪些干扰会影响数据的隔离性:

     1、更新丢失(lost update):当系统允许两个事务同时更新同一数据是,发生更新丢失。

     2、脏读(dirty read):当一个事务读取另一个事务尚未提交的修改时,产生脏读。

      举例说明什么是脏读:

1  23

通过以上三个图不难发现,当事务1去插入一条数据,然后图二去读取被插入数据的表,此时事务1还没有commit结果查询结果直接将内存中的脏数据读取出来,再Read Uncommitted 这个级别下,会出现脏读,一旦数据未提交或者未提交成功则读取数据是脏读错误数据。

     3、非重复读(nonrepeatableread):同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生非重复读。

      举例说明:

      123

以上三图可以清楚表示出,在一个事务中,两个查询对同一个表,而再事务两次查询中发生了一次数据更新,导致事务中两次查询的结果不同。这就是所谓的nonrepeatableread。

     4、幻像(phantom read):同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻像读。

    QQ截图20150521162827

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

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

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

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

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

   QQ截图20150521165334

          

最后附上设置隔离级别的语法(老是记不清楚):

SET TRANSACTION ISOLATION LEVEL
{

READ UNCOMMITTED

| READ COMMITTED

| REPEATABLE READ

| SERIALIZABLE

}

总结

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

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

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

(0)
上一篇 2021年11月25日 上午9:00
下一篇 2021年11月25日 上午9:00


相关推荐

  • 如何反编译dll文件

    如何反编译dll文件DLL DynamicLinkL 文件为动态链接库文件 又称 应用程序拓展 是软件文件类型 下载并解压 NETReflector 下面下载为绿色 7 3 0 18 版本 注 此为英文版 百度有汉化版下载 链接 https pan baidu com s 1eoWFe62wA uOdn3wTQ7e w 密码 gt87

    2025年11月13日
    4
  • Java中间件有哪些

    Java中间件有哪些网关 Nginx Kong Zuul 缓存 Redis MemCached OsCache EhCache 搜索 ElasticSearc Solr 熔断 Hystrix resilience4j 负载均衡 DNS F5 LVS Nginx OpenResty HAproxy 注册中心 Eureka Zookeeper Redis Etcd Consul 认证鉴权 JWT SpringSecuri 消费队列 RabbitMQ Kafka RocketMQ ActiveMQ Redis 系统监控 Gra

    2026年3月18日
    1
  • 整除计算器_整除

    整除计算器_整除原题链接这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由1组成的数字,比如1、11、111、1111等。传说任何一个光棍都能被一个不以5结尾的奇数整除。比如,111111就可以被13整除。 现在,你的程序要读入一个整数x,这个整数一定是奇数并且不以5结尾。然后,经过计算,输出两个数字:第一个数字s,表示x乘以s是一个光棍,第二个数字n是这个光棍的位数。这样的解当然不是唯一的,题目要求你输出最小的解。提示:一个显然的办法是逐渐增加光棍的位数,直到可以整除x为止。但难点在于,s可能是个非常大的数 ——

    2022年8月8日
    9
  • 添加了ValidateRequest=”false”仍然报错的解决办法[通俗易懂]

    添加了ValidateRequest=”false”仍然报错的解决办法[通俗易懂]在文本框传递HTML代码时默认是不允许的,会提示有潜在危险字符,只要在页头的指令中加ValidateRequest=”false”就可以解决,如下所示:或查看配置文件中是否有同样的设置,如:若上述操作后仍然报错,可在配置文件中加入节如下:

    2022年6月9日
    33
  • IIS启动网站出错的几个解决方法

    在ASP.NET项目中使用了IIS服务器,由于系统是XP的,而在装系统的时候IIS没有一起装,所以从网上下载的IIS5.0版本(其它版本XP是用不了的)。但是在使用的过程中老是出问题,每次调试好后,过

    2021年12月22日
    49
  • Linux文件系统从入门到精通:从磁盘硬件到文件管理(小白必看教程)

    Linux文件系统从入门到精通:从磁盘硬件到文件管理(小白必看教程)

    2026年3月16日
    2

发表回复

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

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