提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、事物并发可能带来的错误类型
  • 二、解决方法(可串行化)
    • 1.介绍
    • 2.封锁法(实现可串行化的方法之一)
    • 3.死锁和活锁
      • 方案

前言

在数据库中,并发控制,即允许多个事务同时对数据库进行访问
并发控制:

  • 提高系统利用率和响应时间
  • 不同的事物可能访问数据库不同的部分
  • 当多个事物访问到相同的部分时可能导致执行上的问题

一、事物并发可能带来的错误类型

读写和写写类型:可能导致的问题如丢失更新,读到脏数据,不可重复的读等问题

二、解决方法(可串行化)

1.介绍

可串行化是并发控制的一个标准,简单来说就是有n个事物,会有n!个执行结果,我们只要保证最终执行结果时n!中的一个,就说事物的并发控制是正确的

2.封锁法(实现可串行化的方法之一)

封锁法是决大多数并发控制的解决方法,锁是针对数据对象的,这里以关系为单位,实际上还可以对某个元组上锁等,引入三种封锁机制

  • X锁(排他锁)
    当事物T1给关系R上排他锁之后,这时候T2对R的读写是不允许的

封锁阶段(2PL):
在一个事物中,所有加锁请求都在解锁前面完成,即如下图,我们称这个限定为2PL
在一个事物中,对数据对象进行操作前,我们会寻求先上锁,这是一种好的表现,称为“well-formed"
如果有那么一个计划是满足2PL和well-formed的,我们称这个S计划是可串行化的,即可并操作。

  • S锁(共享锁)
    允许读,不允许写,S可以有多把。T1给R上了S,T2寻求对R的读,则给R也上S,这时候就可以访问R了。这时候对R的X是不允许的,即不允许修改。
  • U锁(更新锁)

对一个更新请求,我们先给上U锁,当真正需要到更新操作时,U锁升级为X锁。这样子可以缩短执行时间,提高并发程度。在U锁的基础上还可以上S锁,即真正修改更新前,我们还可以读操作。

三种锁的并发程度和负担

3.死锁和活锁

死锁:时间顺序上可以理解为T1对R1上X锁,T2对R2上X锁,这时候T2访问到R1,等待T1对R1解锁,处于等待中,但是此时T1也访问到R2,需要等待R2的解锁才可以进行R1的解锁,那么这两个事物就陷入了死循环。再通俗点的一个笑话:hr问你什么时死锁,你回答hr:“你给我offer我就告诉你什么时死锁"。
活锁,也叫饿死现象:尽管不存在死循环,但是等待时间过长

活锁是简单的,我们需要关注的是死锁,从预防和解决两个角度解决死锁问题

方案

  • 等待时间,给事物设置一个等待时间,当一个事物等待时间达到标准时,事物就会被废弃掉。这只适合小型的数据库,对数据库系统来说,如果等待时间设置的太短,会有无辜的事物被当成发生了死锁给处理掉,时间太长就检测不出死锁,效率低下。
  • 等待图,G是事物集合,V是等待时间,当图中出现环的时候,我们就可以认定出现了死锁现象,我们可以周期性检查等待图,或者每当有一个事物添加到图里面时就进行检查。
    当图中发生死锁时,我们会挑一个事物abort掉,使得rollback代价最小
  • 给事物中的关系一次性上锁,不然不执行,但是这样显然效率会很低下
  • 给资源顺序排序,然后在事物中上锁。但是这不符合数据库的应用,数据库中的数据是经常变动的修改的。我们给洗衣机,热水器,微波炉资源排序,如果一个人想要使用这三样,必须按照顺序来,先使用洗衣机,哪怕热水器空着,洗衣机有人在排队。
    - 时间戳,具体应用就是死亡等待和伤害等待,这也是在解决死锁方面常用的有效方案
    时间戳上简单概况包含了TID,即事物的ID,确保每个事物都是独一无二的和比较年龄
    死亡等待:a要用到r,但是b已经锁了r,这时候a和b比较,如果a比较老,就继续等待,a比较年轻的话,直接死掉,后面重启。我们要知道事物会随着时间的推移逐步进行的,即老事物的数量是有限的,新事物是无限的。某个事物年轻,脾气暴躁不能等,无法等到,经过几次重启后,他就会成为最老的,这时候就到他使用了。在他几次排队等待的时间上,后面的比他年轻,也得排在他后面
    伤害等待:年轻的等老的
    无论是哪种,我们都要确保这是单向的,在时间线上遵循同样的原则

数据库中的并发控制和死锁活锁相关推荐

  1. 详解PostgreSQL数据库中的两阶段锁

    点击上方"蓝字" 关注我们,享更多干货! 数据库中的对象是共享的,假如不同的用户同时修改某个对象,就会出现数据错乱,从而破坏数据库的数据一致性,违反事务的隔离性原则. 为了满足隔离 ...

  2. 分布式数据库系统中的并发控制

    Concurrency Control in Distributed Database System 2016 年计算机通信与信息学国际会议 (ICCCI -2016),2016 年 1 月 7 日至 ...

  3. 并发控制——封锁、活锁和死锁

    封锁 封锁就是事务T在对某个数据对象(表.记录等)操作之前,先向系统发出请求,对其枷锁 加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其它的事务不能更新此数据对象 封锁是实现并发控 ...

  4. oracle test就死,简单说明Oracle数据库中对死锁的查询及解决方法

    死锁的原理 当对于数据库某个表的某一列做更新或删除等操作,执行完毕后该条语句不提 交,另一条对于这一列数据做更新操作的语句在执行的时候就会处于等待状态, 此时的现象是这条语句一直在执行,但一直没有执行 ...

  5. 数据库中死锁那些事儿

    转自:http://blog.csdn.net/eseaqyq/article/details/7795023 -------------------------------------------- ...

  6. oracle 解死锁权限,讲解Oracle数据库中结束死锁进程的一般方法

    1.查看死锁1)用dba用户执行以下语句 select username,lockwait,status,machine,program from v$session where sid in (se ...

  7. 数据库题目之并发控制

    一.选择题: 1..设有两个事务T1.T2,其并发操作如下所示,下面评价正确的是. A.该操作不存在问题 B.该操作丢失修改 C.该操作不能重复读 D.该操作读"脏"数据 [答案: ...

  8. 同时更改一条数据_数据库中的引擎、事务、锁、MVCC(二)

    二.事务 介绍锁之前,咱们先介绍一下 什么叫做事务. 事务就是一组对数据库的一系列的操作,要么同时成功,要么同时失败. 1.事务的特性(ACID): 原子性:事务是整个操作,不可分割,要么都成功,要么 ...

  9. 数据库中的乐观锁与悲观锁详解

    目录 悲观锁 乐观锁 悲观锁实现方式 乐观锁实现方式 如何选择 悲观锁 当我们要对一个数据库中的一条数据进行修改的时候,为了避免同时被其他人修改,最好的办法就是直接对该数据进行加锁以防止并发. 这种借 ...

最新文章

  1. Ambari安装之部署 (Metrics Collector和 Metrics Monitor) Install Pending ...问题
  2. linux服务器last查看关机记录
  3. vue赋值与ajax什么区别,Vue中ajax返回的结果赋值
  4. PMO在组织结构中的作用
  5. POI (Apache POI)
  6. 虚拟机安装python包会出问题吗_虚拟机CentOS7安装python3.6.2及requests模块的问题汇总...
  7. 推荐一个PPT副业,日赚800-1000元
  8. 能查阅国外文献的8个论文网站(最新整理)
  9. 根据身份证号 计算具体年龄
  10. 时间复杂度o(1), o(n), o(logn), o(nlogn)
  11. python语言例子_第一个Python实例
  12. 详解Spring Ioc(控制反转)
  13. Java面试之多线程:Java创建多线程为什么只有一种方式?
  14. Vue 使用 video 标签实现视频播放
  15. 12306火车票助手
  16. 重要!SpringBoot一个非常蛋疼的无法启动的问题解决
  17. DM368+MT7601U通过wifi可以正常出图
  18. 基于S32K144实现TPS929120的基本控制功能
  19. 服务器宝塔安装Jenkins
  20. 工具 | RaiDrive—将网盘映射为磁盘

热门文章

  1. ZeroMQ的订阅发布(publish-subscribe)模式
  2. 2022-2028全球与中国鼻部护理市场现状及未来发展趋势
  3. Object—C 块在函数中作为参数时的分析
  4. 计算机教育二级难吗,计算机二级考试到底难不难 好通过吗
  5. Android开发笔记之简易画画板的制作
  6. 疫情汹涌,餐饮行业如何修炼内功科学选址?——数字化降本增效篇
  7. 配置完全免费的https服务器
  8. 每个苹果0.8元,第一天买2个,从第二天起,每天苹果的个数是前天的二倍,直至购买的苹果 *的个数不超过100的最大值为止,编写程序求每天平均花多少钱
  9. 【依存树】短语结构树转化依存树
  10. matlab画柱状图,使得黑白印刷可以分辨