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

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

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

简介   

      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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Delphi 2007安装问题[通俗易懂]

    Delphi 2007安装问题[通俗易懂]
    安装前提是你已经下载了Delphi2007forWin32的ISO。
      Delphi2007安装程序根据不同的序列号(许可文件)来判断安装版本,一般ISO中自带的许可文件是专业版的。
      企业版和专业版的许可文件下载:delphi2007_slip.zip
      C++Builder2007的企业版许可文件(slipfileforC++Builder2007):cb2007_ent.zip
      新装方法:
      1、下载D2

    2022年11月2日
  • 六个主要的社会网络分析软件的比较

    六个主要的社会网络分析软件的比较
    UCINET简介  
        UCINET为菜单驱动的Windows程序,可能是最知名和最经常被使用的处理社会网络数据和其他相似性数据的综合性分析程序。与UCINET捆绑在一起的还有Pajek、Mage和NetDraw等三个软件。UCINET能够处理的原始数据为矩阵格式,提供了大量数据管理和转化工具。该程序本身不包含网络可视化的图形程序,但可将数据和处理结果输出至NetDraw、Pajek、Mage和KrackPlot等软件作图。UCINET包含大量包括探测凝聚子群(cliq

    2022年6月21日
  • size_t和int区别

    size_t和int区别size_t和intsize_t是一些C/C++标准在stddef.h中定义的。这个类型足以用来表示对象的大小。size_t的真实类型与操作系统有关。在32位架构中被普遍定义为:typedefunsignedintsize_t;而在64位架构中被定义为:typedefunsignedlongsize_t;size_t在32位架构上…

    2022年6月6日
  • oracle绑定变量使用方法总结_绑定变量不存在

    oracle绑定变量使用方法总结_绑定变量不存在Stringsql=“select*fromuserswhereusername=?andpwd=?”;pstat=con.prepareStatement(sql);pstat.setString(1,username);pstat.setString(2,pwd);rs=pstat.executeQuery(sql);//后面发现这句写错了System.ou…

    2022年9月3日
  • 【elasticsearch系列】windows安装IK分词器插件[通俗易懂]

    【elasticsearch系列】windows安装IK分词器插件[通俗易懂]环境github下载:https://github.com/medcl/elasticsearch-analysis-ik/releases注意,IK分词器插件要与ES版本保持一致;有的小伙伴在GitHub上下载插件时,没有发现与ES相对应的版本,可以切换到Tags中选择分支版本;例如Branchs列表中仅可能存在主版本号;切换到右侧Tags中查找对应的版本即可;小编这里选择的7.8.0的版本;安装IK解压缩后拷贝到ElasticSearch安装目录的plugins文件夹下,默认情况该

    2022年6月18日
  • webpack 多线程_webpack打包原理优化

    webpack 多线程_webpack打包原理优化happyPack多线程打包如何实现多线程打包?安装happypacknpmihappypack改造webpack.config.js,实现多线程打包jsletHappyPack=require(‘happypack’);module.exports={…module:{rules:[…

    2022年8月31日

发表回复

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

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