文档章节

数据库事务并发与锁详解

Skqing
 Skqing
发布于 2017/09/08 17:26
字数 1791
阅读 16
收藏 0
点赞 0
评论 0

多事务运行并发问题

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

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 如果当前存在事务,则在嵌套事务内执行,如果嵌套事务存在,并且外层事务抛出异常回滚,那么内层事务必须回滚,反之,内层事务并不影响外层事务

本文转载自:https://yq.aliyun.com/articles/29161

共有 人打赏支持
Skqing

Skqing

粉丝 33
博文 145
码字总数 20598
作品 0
深圳
后端工程师
大数据下高并发的处理详解

对于我们开发的网站,如果网站的访问量非常大的话,那么我们就需要考虑相关的并发访问问题了。而并发问题是绝大部分的程序员头疼的问题,但话又说回来了,既然逃避不掉,那我们就要想想应对措...

商者
2016/07/18
33
0
mysql 锁机制 详解二 (死锁)

1 死锁问题背景 1 1.1 一个不可思议的死锁 1 1.1.1 初步分析 3 1.2 如何阅读死锁日志 3 2 死锁原因深入剖析 4 2.1 Delete操作的加锁逻辑 4 2.2 死锁预防策略 5 2.3 剖析死锁的成因 6 3 总结 ...

LYQ1990
2016/05/19
55
0
事务的四大特性和隔离级别

一.什么是事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。 二.事务的 四个特性(ACID ) 事务具有四个特性:原子性( Atomic...

LYQ1990
2016/04/29
69
1
数据库事务基础

一、概述 1.事务概念 在数据库中,事务是指一组逻辑工作单元执行的一系列动作,要么都执行,要么都不执行。 2.事务ACID特性 原子性(Atomic)原子性是指组成一个事务的多个数据库操作是一个不...

小米米儿小
2015/08/28
99
0
数据库的锁机制

在MySQL事务隔离中已经提到了事务隔离级别和脏读、不可重复读、幻读产生的原因。为了应对这些问题,主流数据库都提供了锁机制,并引入了事务隔离级别的概念。 并发控制 在计算机科学,特别是...

Hosee
2016/06/01
189
0
.NET:处理数据库事务中的并发

原帖地址:http://c.jinhusns.com/u/%E7%94%9F%E6%B4%BB/b-183 概述 几乎所有的企业应用程序都有多个用户和后台线程,它们可以同时更新数据库。两个数据库处理事务同时访问同一份数据的情形很...

whp610
2013/09/02
416
0
深入理解乐观锁与悲观锁

在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。 乐观并发控制(乐观锁)和...

Hosee
2016/06/01
356
0
深入理解乐观锁与悲观锁

在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。 乐观并发控制(乐观锁)和...

LYQ1990
2016/04/29
93
0
MySQL存储引擎中的MyISAM和InnoDB区别详解

在使用MySQL的过程中对MyISAM和InnoDB这两个概念存在了些疑问,到底两者引擎有何分别一直是存在我心中的疑问。为了解开这个谜题,搜寻了网络,找到了如下信息: MyISAM是MySQL的默认数据库引...

旋转木马-千里马
2016/09/11
6
0
Mysql InnoDB锁机制

一、MySQL锁机制概述: (一)什么是锁,以及为什么使用锁和锁的运作? 锁是计算机协调多个进程或纯线程并发访问某一资源的机制。在数据库中,除传统的计算资源(CPU、RAM、I/O)的争用以外,...

皮蛋和
2017/12/31
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

OSChina 周一乱弹 —— 你的朋友圈有点生锈了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @Devoes :分享Trademark的单曲《Only Love (电视剧《妙手仁心 II》插曲)》: 《Only Love (电视剧《妙手仁心 II》插曲)》- Trademark 手机党少...

小小编辑
59分钟前
69
5
【面试题】盲人坐飞机

有100位乘客乘坐飞机,其中有一位是盲人,每位乘客都按自己的座位号就坐。由于盲人看不见自己的座位号,所以他可能会坐错位置,而自己的座位被占的乘客会随便找个座位就坐。问所有乘客都坐对...

garkey
今天
1
0
谈谈神秘的ES6——(二)ES6的变量

谈谈神秘的ES6——(二)ES6的变量 我们在《零基础入门JavaScript》的时候就说过,在ES5里,变量是有弊端的,我们先来回顾一下。 首先,在ES5中,我们所有的变量都是通过关键字var来定义的。...

JandenMa
今天
1
0
arts-week1

Algorithm 594. Longest Harmonious Subsequence - LeetCode 274. H-Index - LeetCode 219. Contains Duplicate II - LeetCode 217. Contains Duplicate - LeetCode 438. Find All Anagrams ......

yysue
今天
1
0
NNS拍卖合约

前言 关于NNS的介绍,这里就不多做描述,相关的信息可以查看NNS的白皮书http://doc.neons.name/zh_CN/latest/nns_background.html。 首先nns中使用的竞价货币是sgas,关于sgas介绍可以戳htt...

红烧飞鱼
今天
1
0
Java IO类库之管道流PipeInputStream与PipeOutputStream

一、java管道流介绍 在java多线程通信中管道通信是一种重要的通信方式,在java中我们通过配套使用管道输出流PipedOutputStream和管道输入流PipedInputStream完成线程间通信。多线程管道通信的...

老韭菜
今天
0
0
用Python绘制红楼梦词云图,竟然发现了这个!

Python在数据分析中越来越受欢迎,已经达到了统计学家对R的喜爱程度,Python的拥护者们当然不会落后于R,开发了一个个好玩的数据分析工具,下面我们来看看如何使用Python,来读红楼梦,绘制小...

猫咪编程
今天
1
0
Java中 发出请求获取别人的数据(阿里云 查询IP归属地)

1.效果 调用阿里云的接口 去定位IP地址 2. 代码 /** * 1. Java中远程调用方法 * http://localhost:8080/mavenssm20180519/invokingUrl.action * @Title: invokingUrl * @Description: * @ret......

Lucky_Me
今天
1
0
protobuf学习笔记

相关文档 Protocol buffers(protobuf)入门简介及性能分析 Protobuf学习 - 入门

OSC_fly
昨天
0
0
Mybaties入门介绍

Mybaties和Hibernate是我们在Java开发中应用的比较多的两个ORM框架。当然,目前Mybaties正在慢慢取代Hibernate,这是因为相比较Hibernate而言Mybaties性能更好,响应更快,更加灵活。我们在开...

王子城
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部