多事务运行并发问题

在实际应用中,往往是一台(或多台)服务器向无数客户程序提供服务,当服务器查询数据库获取数据时,如果没有采用必要的隔离机制,可能会存在数据库事务的并发问题,下面是一些常见的并发问题分类:

1. 第一类丢失更新:撤销一个事务,其他事务已提交的更新数据覆盖
2. 第二类丢失更新:一个事务覆盖另一个事务已提交的更新数据
3. 脏读:一个事务读到另一个事务未提交的数据
4. 虚读:一个事物读到另一个已提交的新插入数据
5. 不可重复读:事务读到另一个事务已提交的更新数据

下面对这几类并发问题进行详细介绍:

1. 第一类丢失更新

产生过程:两个事务更新同一数据,第一个事务被提交,第一个事务被撤销,会把第一个事务所做的更新也撤销,示意图如下所示: 

2. 第二类丢失更新

产生过程:两个事务各自基于最初的查询结果提交数据,实例流程如下图所示: 

3. 脏读

产生过程:事务二查询到事务一未提交数据,事务二根据此数据进行操作,事务一紧接着撤销数据,导致事务二操纵的是“脏数据”,实例流程如下图所示: 

4.虚读(幻象读)

产生过程:对某行执行插入或删除操作,而该行属于某个事务正在读取的行的范围。若对数据精度要求不高,则影响不大,实例流程如下图所示: 

5.不可重复读

产生过程:一个事务查询到另一事务已提交的对数据的更新,实例流程如下图所示: 
 
与脏读区别:脏读->读取前一事务未提交的脏数据,不可重复读->重新读取了前一事务已提交的数据

数据库系统锁的基本原理

1. 锁的多粒度及自动升级:

  1. 锁的多粒度按类型可分成下面几类:

    • 数据库级锁
    • 表级锁
    • 区域级锁
    • 页面级锁
    • 键值级锁:锁定数据库表中带有索引的一行数据
    • 行级锁
  2. 对数据的封锁力度越大,往往隔离性越高,但并发性能变差。
  3. 对数据施行的锁粒度越高,并发性往往越大,但这意味着在大并发量时锁的数量的急剧增多,由此会带来系统资源的严重负载,影响系统系统。常用的数据库都有事务锁自动升级功能,当系统性能因为锁数量过大而急剧变差时,往往会升级使用更粗粒度的锁来扩大封锁面,减少锁数优化系统资源。

2. 锁的类型和兼容性:

  1. 共享锁

    • 加锁条件:读取数据
    • 解锁条件:读取完毕
    • 兼容性:放置了共享锁的资源,能再放置共享锁和独占锁
    • 并发性:多事务访问相同数据,多锁同时读
  2. 独占锁(排它锁)

    • 加锁条件:修改数据且无其他锁存在
    • 解锁条件:事务结束
    • 兼容性:不与其他锁兼容
  3. 更新锁

    • 加锁条件:update操作
    • 加锁更新步骤: 
      1. 获得一个共享锁,读数据
      2. 升级为独占锁,更新数据
    • 兼容性:与共享锁兼容,同一资源最多一把更新锁,能有效避免死锁产生,我们知道,共享锁的兼容性是最好的,加入一个数据同时被两把共享锁锁住,如果这时两条线程并发修改数据,由于共享锁的非排他性,可能会同时出现两把独占锁锁住数据,这样就会产生死锁了,而更新锁排斥独占锁,当出现更新操作时,只能将更新锁本身升级为独占锁,而有效避免死锁产生。
    • 并发性:性能一般,多事务访问,单事务修改。 
      -

3. 死锁产生及其解决方法:

  1. 产生过程:多事务锁定一个资源->试图去锁定对方已锁定的资源->多事务处于等待对方释放锁资源状态,示意图如下所示: 
  2. 防止方法 
    1. 合理安排表访问顺序
    2. 对事务要求不高,允许脏读(不加锁)
    3. 错开多事务访问相同资源的时间
    4. 使用尽可能低的事务隔离级别
    5. 使用短事务(操作尽可能少,时间尽可能短)
    6. 将大事务分解成多个小事务顺序执行

4. 悲观锁与悲观锁

  1. 悲观锁:显式为数据加锁,常见有如下两种加锁方式 
    1. 显式指定独占锁:select … for update
    2. 在数据库增加表明状态的LOCK字段
  2. 乐观锁:通过版本控制实现,示意图如下所示: 
     
    通过乐观锁的版本控制,我们能够更好地提高并发事务的性能。

3. 数据库的事务隔离级别

4种隔离级别从高到低依次为: 
- Serializable:串行化 
- Repeatable Read: 可重复读 
- Read Commited:读已提交的数据 
- Read UnCommited:读未提交的数据

它们对并发事务问题的支持如下图所示 

4. spring的事务传播行为

事务传播行为类型 说明
PROPAGATION_REQUIRED 如果当前没有事务,就新建一个,如果已经存在,则加入到事务中这是最常见的选择。
PROPAGATION_SUPPORTS 表示事务对当前方法可有可无,如果有,则按该事务执行,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY 表示当前方法必须在一个事务中执行,而且如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW 表示当前方法总是需要独立的新事务,如果当前已存在事务,就会把当前事务挂起,直到新的事务提交或者回滚才恢复执行
PROPAGATION_NOT_SUPPORTED 表示当前方法不需要事务,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER 表示当前方法不需要事务,而且如果当前存在事务,则抛出异常。
PROPAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行,如果嵌套事务存在,并且外层事务抛出异常回滚,那么内层事务必须回滚,反之,内层事务并不影响外层事务

多事务运行并发问题spring学习笔记——数据库事务并发与锁详解的更多相关文章

  1. spring学习笔记---数据库事务并发与锁详解

    多事务运行并发问题 在实际应用中,往往是一台(或多台)服务器向无数客户程序提供服务,当服务器查询数据库获取数据时,如果没有采用必要的隔离机制,可能会存在数据库事务的并发问题,下面是一些常见的并发问题分 ...

  2. Linux防火墙iptables学习笔记(三)iptables命令详解和举例[转载]

     Linux防火墙iptables学习笔记(三)iptables命令详解和举例 2008-10-16 23:45:46 转载 网上看到这个配置讲解得还比较易懂,就转过来了,大家一起看下,希望对您工作能 ...

  3. (转)live555学习笔记10-h264 RTP传输详解(2)

    参考: 1,live555学习笔记10-h264 RTP传输详解(2) http://blog.csdn.net/niu_gao/article/details/6936108 2,H264 sps ...

  4. Hibernate学习笔记二:Hibernate缓存策略详解

    一:为什么使用Hibernate缓存: Hibernate是一个持久层框架,经常访问物理数据库. 为了降低应用程序访问物理数据库的频次,从而提高应用程序的性能. 缓存内的数据是对物理数据源的复制,应用 ...

  5. 学习笔记--Grunt、安装、图文详解

    学习笔记--Git安装.图文详解 安装Git成功后,现在安装Gruntjs,官网:http://gruntjs.com/ 一.安装node 参考node.js 安装.图文详解 (最新的node会自动安 ...

  6. Java8学习笔记(五)--Stream API详解[转]

    为什么需要 Stream Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念.它也不同于 StAX 对 ...

  7. SNMP学习笔记之SNMP 原理与实战详解

    原文地址:http://freeloda.blog.51cto.com/2033581/1306743 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法 ...

  8. Django学习笔记之Django Form表单详解

    知识预览 构建一个表单 在Django 中构建一个表单 Django Form 类详解 使用表单模板 回到顶部 构建一个表单 假设你想在你的网站上创建一个简单的表单,以获得用户的名字.你需要类似这样的 ...

  9. 大数据学习笔记——Spark工作机制以及API详解

    Spark工作机制以及API详解 本篇文章将会承接上篇关于如何部署Spark分布式集群的博客,会先对RDD编程中常见的API进行一个整理,接着再结合源代码以及注释详细地解读spark的作业提交流程,调 ...

随机推荐

  1. UVa 11743 - Credit Check

    题目:推断卡号是否合法,给你4组4位的数字.偶数位的2倍的位和加上奇数位的和,推断尾数是否为0. 分析:简单题,模拟. 直接依照提议推断就可以. 说明:460题,加油! #include <io ...

  2. 【翻译自mos文章】OGG的集成捕捉模式支持Oracle database标准版么?

    OGG的集成捕捉模式支持Oracle database标准版么? 来源于: Does OGG 11.2.1 Integrated Capture Work with Oracle Database S ...

  3. BZOJ 1027 JSOI2007 合金 计算几何+Floyd

    题目大意:给定一些合金,选择最少的合金,使这些合金能够按比例合成要求的合金 首先这题的想法特别奇异 看这题干怎么会想到计算几何 并且计算几何又怎么会跟Floyd挂边 好强大 首先因为a+b+c=1 所 ...

  4. 解决配置Ubuntu中vnc远程显示灰屏

    解决配置Ubuntu中vnc远程显示灰屏a. 缺失图形化工具b.  ~/.vnc/xstartup 权限不对1. Ubuntu 16.04 安装 VNC 及 Mate 桌面环境https://www. ...

  5. php数组时按值传递还是按地址传递

    php数组时按值传递还是按地址传递 一.总结 1.数组都是按值:php普通变量和数组的赋值(=)是按值传递,对象的赋值(=)是按址传递 2.对象和按值和按址:对象的clone(用clone关键字)是按 ...

  6. uva 1456(dp)

    题意:有n个数字u1,u2,u3-un,每一个数字出现的概率pi = ui/(u1 + u2 + - + un),分成w组.计算期望值. 第一组例子的五个数字例如以下 30 5 10 30 25 分成 ...

  7. 在C#中实现Word页眉页脚的全部功能

    页眉页脚经常使用于文章排版,在Word工具栏里.我们能够加入页眉,页脚,页码,日期和时间.图片等信息和内容.页眉/页脚有两个额外选项:首页不同,奇偶页不同.有时在不同的节(section)里插入不同的 ...

  8. Spark 概念学习系列之Spark 多语言编程

    不多说,直接上干货! Spark 同时支持Scala.Python.Java 三种应用程序API编程接口和编程方式, 考虑到大数据处理的特性,一般会优先使用Scala进行编程,其次是Python,最后 ...

  9. PythonServer

    服务器模型 硬件服务器 主机.集群 厂商:IBM.HP.联想.浪潮 软件服务器:编写的服务端应用程序,在硬件服务器上运行,一般依托于操作系统,给用户提供一套完整的服务 httpserver:处理htt ...

  10. 【博客之星】CSDN2013博客之星--分析和预测

    本文纯属个人见解,多有得罪啊! 具体结果,还是看最后CSDN给的结果吧! 昵称 名字 题材 质量 数量 知名度 预测 阳光岛主 杨刚 Python,Clojure,SAE 很高 346+ 很大 一定( ...