当前位置: 首页 > news >正文

事务隔离级别小记

事务的四个属性:原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)。

1.原子性(Atomic)
    最重要的原则,也是最容易理解的原则。被事务管理的所有方法,要么一起被提交,要么一起回滚。

2.一致性(Consistency)
    事务在系统完整性中实施一致性,如果事务成功地完成,那么系统中所有变化将正确地应用,系统处于新有效状态。如果在事务中出现错误,那么系统中的所有变化将自动地回滚,系统返回到原始状态。

3.隔离性(Isolation)
    在隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。重要的是,在隔离状态执行事务,系统的状态有可能是不一致的,在结束事务前,应确保系统处于一致状态。但是在每个单独的事务中,系统的状态可能会发生变化。如果事务不是在隔离状态运行,它就可能从系统中访问数据,而系统可能处于不一致状态。通过提供事务隔离,可以阻止这类事件的发生。

4.持久性(Durability)
    持久性意味着一旦事务执行成功,在系统中产生的所有变化将是永久的。应该存在一些检查点防止在系统失败时丢失信息。甚至硬件本身失败,系统的状态仍能通过在日志中记录事务完成的任务进行重建。

数据库锁概念:
    在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。
    从程序员的角度看,锁分为以下两种类型: 
    1.乐观锁(Optimistic Lock) 
    乐观锁假定在处理数据时,不需要在应用程序的代码中做任何事情就可以直接在记录上加锁、即完全依靠数据库来管理锁的工作。一般情况下,当执行事务处理时SQL Server会自动对事务处理范围内更新到的表做锁定。 
    2.悲观锁(Pessimistic Lock) 
    悲观锁对数据库系统的自动管理不感冒,需要程序员直接管理数据或对象上的加锁处理,并负责获取、共享和放弃正在使用的数据上的任何锁。

事务隔离级别
    一个事务必须与其它事务进行隔离的程度。较低的隔离级别可以增加并发,但代价是降低数据的正确性。相反,较高的隔离级别可以确保数据的正确性,但可能对并发产生负面影响。

数据库并发操作存在的异常情况:
1. 更新丢失(Lost update):两个事务都同时更新一行数据但是第二个事务却中途失败退出导致对数据两个修改都失效了这是系统没有执行任何锁操作因此并发事务并没有被隔离开来

2. 脏读取(Dirty Reads):一个事务开始读取了某行数据但是另外一个事务已经更新了此数据但没有能够及时提交。这是相当危险很可能所有操作都被回滚

3. 不可重复读取(Non-repeatable Reads):一个事务对同一行数据重复读取两次但是却得到了不同结果。例如在两次读取中途有另外一个事务对该行数据进行了修改并提交

4. 两次更新问题(Second lost updates problem):无法重复读取特例,有两个并发事务同时读取同一行数据然后其中一个对它进行修改提交而另一个也进行了修改提交这就会造成第一次写操作失效

5. 幻读(Phantom Reads):也称为幻像(幻影)。事务在操作过程中进行两次查询,第二次查询结果包含了第一次查询中未出现的数据(这里并不要求两次查询SQL语句相同)这是因为在两次查询过程中有另外一个事务插入数据造成的

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

1.未授权读取(Read Uncommitted):也称未提交读。允许脏读取但不允许更新丢失,如果一个事务已经开始写数据则另外一个数据则不允许同时进行写操作但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。事务隔离的最低级别,仅可保证不读取物理损坏的数据。与READ COMMITTED 隔离级相反,它允许读取已经被其它用户修改但尚未提交确定的数据。

2. 授权读取(Read Committed):也称提交读。允许不可重复读取但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现,读取数据的事务允许其他事务继续访问该行数据,但是未提交写事务将会禁止其他事务访问该行。SQL Server 默认的级别。在此隔离级下,SELECT 命令不会返回尚未提交(Committed) 的数据,也不能返回脏数据。

3. 可重复读取(Repeatable Read):禁止不可重复读取和脏读取。但是有时可能出现幻影数据,这可以通过“共享读锁”和“排他写锁”实现,读取数据事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。在此隔离级下,用SELECT 命令读取的数据在整个命令执行过程中不会被更改。此选项会影响系统的效能,非必要情况最好不用此隔离级。

4. 串行(Serializable):也称可串行读。提供严格的事务隔离,它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作事务访问到。事务隔离的最高级别,事务之间完全隔离。如果事务在可串行读隔离级别上运行,则可以保证任何并发重叠事务均是串行的。


隔离级别更新丢失脏读取重复读取幻读
未授权读取NYYY
授权读取NNYY
可重复读取NNNY
串行NNNN



Blog : http://agapple.javaeye.com/  欢迎访问

http://www.blogjava.net/agapple/archive/2009/02/15/254801.html

 

相关文章:

  • C# 语言规范_版本5.0 (第1章 介绍)
  • Oracle创建存储过程、执行存储过程基本语法
  • java- Java IO
  • qt 共享内存 单例
  • phpcms V9 内容模型管理(转)
  • Swift开发小技巧--自定义Log
  • 练习:WinForm(控件Button,打开,关闭窗体)
  • html中,文件上传时使用的input type=file的样式自定义
  • 用DBHelper在JSP页面中实现登录功能
  • Haproxy------在windows下配置负载均衡
  • redis使用及配置之缓存详解
  • Codeforces 219D Choosing Capital for Treeland
  • Travix是如何部署应用程序到Kubernetes上的
  • 猜数字游戏
  • 4.slatstack文件系统与grains,pillar
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • HTTP中GET与POST的区别 99%的错误认识
  • input实现文字超出省略号功能
  • javascript从右向左截取指定位数字符的3种方法
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • Spring核心 Bean的高级装配
  • 反思总结然后整装待发
  • 浮动相关
  • 基于HAProxy的高性能缓存服务器nuster
  • 爬虫模拟登陆 SegmentFault
  • 全栈开发——Linux
  • 使用putty远程连接linux
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • ​2020 年大前端技术趋势解读
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ![CDATA[ ]] 是什么东东
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (003)SlickEdit Unity的补全
  • (4)事件处理——(7)简单事件(Simple events)
  • (C语言)球球大作战
  • (floyd+补集) poj 3275
  • (Git) gitignore基础使用
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (五)IO流之ByteArrayInput/OutputStream
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • (转)为C# Windows服务添加安装程序
  • **PHP二维数组遍历时同时赋值
  • .net 8 发布了,试下微软最近强推的MAUI
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .net专家(张羿专栏)
  • .Net组件程序设计之线程、并发管理(一)