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

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

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

简介   

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


相关推荐

  • lrzsz安装

    lrzsz安装当服务器没有安装FTP等工具上传文件时,可以通过rz上传文件,sz文件名进行下载文件,默认下载路径为:C:\Users\用户\Downloads,安装如下:yuminstalllrzsz-y转载于:https://www.cnblogs.com/heruiguo/p/8417031.html…

    2022年6月23日
    29
  • Linux C Socket UDP编程介绍及实例

    Linux C Socket UDP编程介绍及实例1 UDP 网络编程主要流程 UDP 协议的程序设计框架 客户端和服务器之间的差别在于服务器必须使用 bind 函数来绑定侦听的本地 UDP 端口 而客户端则可以不进行绑定 直接发送到服务器地址的某个端口地址 框图如图 1 3 所示 UDP 协议的服务器端流程服务器流程主要分为下述 6 个部分 即建立套接字 设置套接字地址参数 进行端口绑定 接收数据 发送数据 关闭套接字等 1 建立套接字文件描述符

    2025年12月10日
    4
  • 国内十大正规现货交易平台排名(2021版榜单)

    国内十大正规现货交易平台排名(2021版榜单)现货亦称实物,指可供出货、储存和制造业使用的实物商品。可供交割的现货可在近期或远期基础上换成现金,或先付货,买方在极短的期限内付款的商品的总称。期货的对称。随着互联网的出现,世界已慢慢变成地球村,建立在信息化基础上的现货电子交易走上新经济的舞台。现货电子交易(也称为大宗商品电子交易,或现货仓单交易)是以现货仓单为交易的标的物,采用计算机网络进行的集中竞价买卖,统一撮合成交,统一结算付款,价格行情实时显示的交易方式。国内不少投资者对现货交易还不是太了解,下面小编为您介绍“国内十大正规现货交易平台排名(20

    2022年6月15日
    59
  • zencart 模板文件说明

    zencart 模板文件说明如果要修改zencart模板页面背景就在includes/templates/your_template/css文件夹里的:css/stylesheet.css主样式表,修改页面背景,字体大小颜色都找它common里的:common/html_header.php页面的head部分,一般不需要修改,注意它与下面文件的区别。common/tpl_header.php网店页面…

    2022年7月27日
    6
  • C# 经典排序算法大全

    C# 经典排序算法大全

    2022年1月4日
    46
  • React之react-router(connected-react-router/react-router-dom)

    React之react-router(connected-react-router/react-router-dom)

    2020年11月19日
    175

发表回复

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

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