数据库并发问题总结(锁、隔离级别、死锁)

高并发情况下,MYSQL的锁等待问题分析和解决方案 问题描述 在进行高并发性能调优的时候发现了如下的一个问题: 1. 在一个事务中同时包括了SELECT,UPDATE和INSERT语句 2. SELECT和UPDATE涉及到的数据为同一张表中的同一套记录 3. 在并发为10的情况下就会触发数据库锁等待和死锁的情况 问题分析 在问题分析之前引入几个概念 共享锁 SELECT 语句时对查询行加的锁类型为共享锁。 共享锁的特性为: 不... 阅读详情

  锁是一种防止在某对象执行动作的一个进程与已在该对象上执行的其他进行相冲突的机制。也就是说,如果有其他人在操作某个对象,那么你旧不能在该对象上进行操作。你能否执行操作取决于其他用户正在进行的操作。

通过锁可以防止的问题

  锁可以解决以下4种主要问题(也是多线程并发会导致的一些问题):

  • 脏读
  • 非重复性读取
  • 幻读
  • 丢失更新

  1、脏读

  如果一个事务读取的记录是另一个未完成事务的一部分,那么这时就发生了脏读。如果第一个事务正常完成,那么就有什么问题。但是,如果前一个事务回滚了呢,那将从数据库从未发生的事务中获取了信息。

  2、非重复性读取

  很容易将非重复性读取和脏读混淆。如果一个事务中两次读取记录,而另一个事务在这期间改变了数据,就会发生非重复性读取。
例如,一个银行账户的余额是不允许小于0的。如果一个事务读取了某账户的余额为125元,此时另一事务也读取了125元,如果两个事务都扣费100元,那么这时数据库的余额就变成了-75元。

  有两种方式可以防止这个问题:

  • 创建CHECK约束并监控547错误
  • 将隔离级别设置为REPEATABLEREAD或SERIALIZABLE

  CHECK约束看上去相当直观。要知道的是,这是一种被动的而非主动的方法。然而,在很多情况下可能需要使用非重复性读取,所以这在很多情况下是首选。

  3、幻读

  幻读发生的概率非常小,只有在非常偶然的情况下才会发生。

  比如,你想将一张工资表里所有低于100的人的工资,提高到100元。你可能会执行以下SQL语句:

  UPDATE tb_Money SET Salary = 100
  WHERE Salary < 100

  这样的语句,通常情况下,没有问题。但是如果,你在UPDATE的过程中,有人恰好有INSERT了一条工资低于100的数据,因为这是一个全新的数据航,所以没有被锁定,而且它会被漏过Update。

  要解决这个问题,唯一的方法是设定事务隔离级别为SERIALIZABLE,在这种情况下,任何对表的更新都不能放入WHERE子句中,否则他们将被锁在外面。

  4、丢失更新

  丢失更新发生在一个更新成功写入数据库后,而又意外地被另一个事务重写时。这是怎么发生的呢?如果有两个事务读取整个记录,然后其中一个向记录写入了更新信息,而另一个事务也向该记录写入更新信息,这是就会出现丢失更新。

  有个例子写得很好,这里照敲下来吧。假如你是公司的一位信用分析员,你接到客户X打开的电话,说他已达到它的信用额度上限,想申请增加额度,所以你查看了这位客户的信息,你发现他的信用额度是5000,并且看他每次都能按时付款。

  当你在查看的时候,信用部门的另一位员工也读取了客户X的记录,并输入信息改变了客户的地址。它读取的记录也显示信用额度为5000。

  这时你决定把客户X的信用额度提高到10000,并且按下了Enter键,数据库现在显示客户X的信用额度为10000。

  Sally现在也更新了客户X的地址,但是她仍然使用和您一样的编辑屏幕,也就是说,她更新了整个记录。还记得她屏幕上显示的信用额度吗?是5000.数据库现在又一次显示客户X的信用额度为5000。你的更新丢失了。

  解决这个问题的方法取决于你读取某数据和要更新数据的这段时间内,代码以何种方式识别出另一连接已经更新了该记录。这个识别的方式取决于你所使用的访问方法。

可以锁定的资源

对于SQL Server来说,有6种可锁定的资源,而且它们形成了一个层次结构。锁的层次越高,它的粒度就越粗。按粒度由粗到细排列,这些资源包括:

  • 数据库:锁定整个数据库。这通常发生在整个数据库模式改变的时候。
  • 表:锁定整个表。这包含了与该表相关联的所有数据相关的对象,包括实际的数据行(每一行)以及与该表相关联的所有索引中的键。
  • 区段:锁定整个区段。因为一个区段由8页组成,所以区段锁定是指锁定控制了区段、控制了该区段内8个数据或索引页以及这8页中的所有数据航。
  • 页:锁定该页中的所有数据或索引键。
  • 键:在索引中的特定键或一系间上有锁。相同索引页中的其他键不受影响。
  • 行或行标识符:虽然从技术上将,锁是放在行标识符上的,但是本质上,它锁定了整个数据行。

锁的分类

首先看一下锁的关系图:

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190702192932901.png)
注解:

1.乐观锁一般是指用户自己实现的一种锁机制,假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让返回用户错误的信息,让用户决定如何去做。乐观锁的实现方式一般包括使用版本号和时间戳。

2.悲观锁一般就是我们通常说的数据库锁机制,以下讨论都是基于悲观锁。

2.1 悲观锁主要表锁、行锁、页锁。
2.1.1 在MyISAM中只用到表锁,不会有死锁的问题,锁的开销也很小,但是相应的并发能力很差。

2.1.2 innodb实现了行级锁和表锁,锁的粒度变小了,并发能力变强,但是相应的锁的开销变大,很有可能出现死锁。同时innodb需要协调这两种锁,算法也变得复杂。InnoDB行锁是通过给索引上的索引项加锁来实现的,只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁。

2.1.3表锁和行锁都分为共享锁和排他锁(独占锁),而更新锁是为了解决行锁升级(共享锁升级为独占锁)的死锁问题。

2.1.4 关于意向锁的解释:
在mysql中有表锁,读锁锁表,会阻塞其他事务修改表数据。写锁锁表,会阻塞其他事务读和写。
Innodb引擎又支持行锁,行锁分为共享锁,一个事务对一行的共享只读锁。排它锁,一个事务对一行的排他读写锁。
这两中类型的锁共存的问题考虑这个例子:事务A锁住了表中的一行,让这一行只能读,不能写。之后,事务B申请整个表的写锁。如果事务B申请成功,那么理论上它就能修改表中的任意一行,这与A持有的行锁是冲突的。数据库需要避免这种冲突,就是说要让B的申请被阻塞,直到A释放了行锁。

数据库要怎么判断这个冲突呢?

若没有意向锁,解决办法为:
step1:判断表是否已被其他事务用表锁锁表
step2:判断表中的每一行是否已被行锁锁住。
注意step2,这样的判断方法效率实在不高,因为需要遍历整个表。于是就有了意向锁。在意向锁存在的情况下,事务A必须先申请表的意向共享锁,成功后再申请一行的行锁。

在意向锁存在的情况下,上面的判断可以改成
step1:不变
step2:发现表上有意向共享锁,说明表中有些行被共享行锁锁住了,因此,事务B申请表的写锁会被阻塞。

注意:申请意向锁的动作是数据库完成的,就是说,事务A申请一行的行锁的时候,数据库会自动先开始申请表的意向锁,不需要我们程序员使用代码来申请。

数据库四种隔离级别

了解了数据的锁机制,数据库的隔离级别也就好理解多了。每一种隔离级别满足不同的数据要求,使用不同程度的锁。
  • Read Uncommitted,读写均不使用锁,数据的一致性最差,也会出现许多逻辑错误;会导致脏读、丢失更新(覆盖)、不可重复读、幻读
  • Read Committed,使用写锁,解决了脏读和丢失更新的问题,但是不能解决不可重复读和幻读
  • Repeatable Read, 使用读锁和写锁,解决脏读、丢失更新、不可重复读问题,不能解决幻读问题
  • Serializable, 使用事务串形化调度,避免出现因为插入数据没法加锁导致的不一致的情况,解决所有多线程问题 ,但是本质是单线程处理,性能极低
  • 读不提交,造成脏读(Read Uncommitted)
  • 一个事务中的读操作可能读到另一个事务中未提交修改的数据,如果事务发生回滚就可能造成错误。

    例子:A打100块给B,B看账户,这是两个操作,针对同一个数据库,两个事物,如果B读到了A事务中的100块,认为钱打过来了,但是A的事务最后回滚了,造成损失。

    避免这些事情的发生就需要我们在写操作的时候加锁,使读写分离,保证读数据的时候,数据不被修改,写数据的时候,数据不被读取。从而保证写的同时不能被另个事务写和读。

  • 读提交(Read Committed)
  • 我们加了写锁,就可以保证不出现脏读,也就是保证读的都是提交之后的数据,但是会造成不可重读,即读的时候不加锁,一个读的事务过程中,如果读取数据两次,在两次之间有写事务修改了数据,将会导致两次读取的结果不一致,从而导致逻辑错误。

  • 可重读(Repeatable Read)
  • 解决不可重复读问题,一个事务中如果有多次读取操作,读取结果需要一致(指的是固定一条数据的一致,幻读指的是查询出的数量不一致)。 这就牵涉到事务中是否加读锁,并且读操作加锁后是否在事务commit之前持有锁的问题,如果不加读锁,必然出现不可重复读,如果加锁读完立即释放,不持有,那么就可能在其他事务中被修改,若其他事务已经执行完成,此时该事务中再次读取就会出现不可重复读,

    所以读锁在事务中持有可以保证不出现不可重复读,写的时候必须加锁且持有,这是必须的了,不然就会出现脏读。Repeatable Read(可重读)也是MySql的默认事务隔离级别,上面的意思是读的时候需要加锁并且保持

  • 可串行化(Serializable)
  • 解决幻读问题,在同一个事务中,同一个查询多次返回的结果不一致。事务A新增了一条记录,事务B在事务A提交前后各执行了一次查询操作,发现后一次比前一次多了一条记录。幻读是由于并发事务增加记录导致的,这个不能像不可重复读通过记录加锁解决,因为对于新增的记录根本无法加锁。需要将事务串行化,才能避免幻读。 这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争

    处理死锁

      死锁的错误号是1205。

      如果一个锁由于另一个锁占有资源而不能完成应该做的清除资源工作,就会导致死锁;反之亦然。当发生死锁时,需要其中的一方赢得这场斗争,所以SQL Server选择一个死锁牺牲者,对死锁牺牲者的事务进行回滚,并且通过1205错误来通知发生了死锁。另外一个事务将继续正常地运行。

      1、判断死锁的方式

      每隔5秒钟,SQL Server就会检查所有当前的事务,了解他们在等待什么还未被授予的锁。然后再一次重新检查所有打开的锁请求的状态,如果先前请求中有一个还没有被授予,则它会递归地检查所有打开的事务,寻找锁定请求的循环链。如果SQL Server找到这样的村换连,则将会选择一个或更多的死锁牺牲者。

      2、选择死锁牺牲者的方式

      默认情况下,基于相关事务的"代价",选择死锁牺牲者。SQL Server将会选择回滚代价最低的事务。在一定程度上,可以使用SQL Server中的DEADLOCK_PRIORITY SET选项来重写它。

      3、避免死锁

    避免死锁的常用规则

    • 按相同的顺序使用对象
    • 使事务尽可能简短并且在一个批处理中。
    • 尽可能使用最低的事务隔离级别。
    • 在同一事务中不允许无限度的中断。
    • 在控制环境中,使用绑定连接。

      1、按相同的顺序使用对象

      例如有两个表:Suppliers和Products。假设有两个进程将使用这两个表。进程1接受库存输入,用手头新的产品总量更新Products表,接下来用已经购买的产品总量来更新Suppliers表。进程2记录销售数据,它在Supperlier表中更新销售产品的总量,然后在Product中减少库存数量。

      如果同时运行这两个进程,那么就有可能碰到麻烦。进程1试图获取Product表上的一个排他锁。进程2将在Suppliers表上获取一个排他锁。然后进程1将试图获取Suppliers表上的一个锁,但是进程1必须等到进程2清除了现有的锁。同时进程2也在等待进程1清除现有锁。

      上面的例子是,两个进程用相反的顺序,锁住两个表,这样就很容易发生死锁。

      如果我们将进程2改成首先在Products减少库存数量,接着在Suppliers表中更新销售产品的总数量。两个进程以相同的顺序访问两张表,这样就能够减少死锁的发生。

      2、使事务尽可能简短

      保持事务的简短将不会让你付出任何的代价。在事务中放入想要的内容,把不需要的内容拿出来,就这么简单。它的原理并不复杂-事务打开的时间越长,它触及的内容就越多,那么其他一些进程想要得到正在使用的一个或者多个对象的可能性就越大。如果要保持事务简短,那么就将最小化可能引起死锁的对象的数量,还将减少锁定对象的时间。原理就如此简单。

      3、尽可能使用最低的事务隔离级别

      使用较低的隔离级别和较高的隔离级别相比,共享锁持续的时间更短,因此会减少锁的竞争。

      4、不要采用允许无限中断的事务

      当开始执行某种开放式进程时间,不要创建将一直占有资源的锁。通常,指的是用户交互,但它也可能是允许无限等待的任何进程。

     

    参考文章:

    • https://blog.youkuaiyun.com/yen_csdn/article/details/51814912
    • https://www.cnblogs.com/kissdodog/p/3170036.html
    • https://blog.youkuaiyun.com/C_J33/article/details/79487941
MySQL基础之锁 共享锁:允许多个事务同时读取数据,是数据库管理系统实现并发控制的一种机制,但是数据被读取期间,事务不能对数据进行修改,这种锁通常用于实现事务的可重复读(repeatable read)隔离级别。在这个级别上,事务会对读取的所有行加上锁,无论是共享锁还是排他锁,并且会使用范围锁来保护一系列值不被其他事务修改。锁分为全局锁、表级锁、行级锁。在当前事务创建一个排他锁之后,当前事务仍具有该表的增删改查权限,其它事务将无法对该表进行增删改查操作,必须等待当前事务完成并且锁被释放,其它事务才能对该表进行增删改查。 阅读详情

相关推荐

从SPI到JTAG:玩转FT2232H的MPSSE多协议切换指南(附配置代码)

本文详细介绍了如何利用FT2232H芯片的MPSSE技术实现SPI与JTAG协议的无缝切换,提供配置代码和调试技巧。通过解析MPSSE引擎架构和硬件特性,帮助开发者灵活应对多种串行协议需求,提升嵌入式开发效率。特别适合FPGA调试和物联网设备开发场景。

sun99的博客 254

并发控制中存在问题及解决方案

一、并发控制定义 在数据库中,并发控制是指在多个用户/进程/线程同时对数据库进行操作时,保证事务的一致性和隔离性,同时最大程度地并发。并发控制的目的是保证一个用户的工作不会对另一个用户的工作产生不合理的影响。在某些情况下,这些措施保证了当用户和其他用户一起操作时,所得的结果和她单独操作时的结果是一样的。 二、并发中存在的冲突状况 1、读-读 不存在任何问题 2、读-写 有隔离性问题,可...

李木子的博客 1万+

一步一步教你写股票走势图——K线图一(概述)

股票分时图部分已经开发完毕,受到了广大开发者的好评!界面、功能都挺完美,解决了好一些MP开发者的问题,博主甚是欣悦,更有动力去开源K线图。这里说一下,如果有问题直接留言或者发邮件,github上个人信息有邮件,我看到基本都会回复,博主不加qq的,体谅O(∩_∩)O。分析好了,废话不多说,我们分析下K线图吧,首先我们看下自选股K线图的效果吧效果还是很赞的,经过分时图的研究后,博主越来越确信自选股用的应

体验Android编程之美 3万+

高并发与锁

高并发与锁 高并发系统往往会存在数据不一致的问题。例如某购物网站发布的秒杀商品,在同一时间点,可能存在几万甚至上百万的用户访问,这就是一个典型的高并发场景。 在高并发场景,多个线程同时享有并访问数据。由于线程每一步的完成顺序不一样,会存在数据不一致的问题。 当前互联网主要通过悲观锁和乐观锁来解决高并发场景下的数据不一致问题。 1 悲观锁 悲观锁是一种利用数据库内部机制提供的锁的方法,也就是对更新的...

Milingyun的博客 355

R语言实战:三因素方差分析(ANOVA)从入门到精通(附完整代码解析)

本文详细介绍了如何使用R语言进行三因素方差分析(ANOVA),从数据准备、模型构建到结果解读与可视化,提供完整代码解析。通过实战案例,帮助读者掌握复杂交互效应的分析方法,适用于科研、教育等多个领域的数据分析需求。

weixin_29081101的博客 244

将外部电磁近场数据导入 ANSYS HFSS

本博客介绍了如何将电磁近场数据导入 ANSYS HFSS。用户可能需要导入字段,无论是通过分析计算、测量、由其他工具生成还是从提供商处接收的字段,并将其用作实际激励来执行不同类型的分析。以下是导入过程的简要概述,视频链接中提供了完整的演示。为了定义简单基元近场源,HFSS 使用两种外部数据文件。首先,实际位置/字段数据以 .nfd 格式存储。其次,Ansys Near field Descriptor 文件(.and 文件)存储 .nfd 数据的一般几何信息和路径。

jkh920184196的博客 2327

数据库常见死锁原因及处理

数据库是一个多用户使用的共享资源,当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。加锁是实现数据库并发控制的一个非常重要的技术。在实际应用中经常会遇到的与锁相关的异常情况,当两个事务需要一组有冲突的锁,而不能将事务继续下去的话,就会出现死锁,严重影响应用的正常执行。 在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它

yzx3105的博客 1万+

RGB接口电容触摸屏驱动(二)接口与时序说明

RGB接口电容触摸屏驱动(二)接口与时序说明

杰克拉力船长个人博客 4920

数据库—并发控制(封锁)

一个SQl或者一组SQL语句都能称为一个事务。事务的特性。

本散修的一些学习心得与笔记,道友请自便。 1211

微信小程序协同工作和发布

微信小程序协同工作和发布

qq_53114527的博客 1621

Python 神经计算实训 实训答案分享

【代码】Python 神经计算实训 实训答案分享。

2403_89314916的博客 351

数据库死锁详解:原因、检测与解决方案

数据库死锁是指两个或多个事务在操作资源时相互等待对方释放资源,形成一种循环依赖,从而导致这些事务无法继续执行下去的现象。在高并发的数据库操作中,死锁会直接影响系统性能,甚至导致系统崩溃。本文将深入分析数据库死锁的产生原因、检测方法和处理方案,以帮助开发者预防和解决死锁问题。

qq_43535970的博客 3967

由于找不到mfc110u.dll,无法继续执行代码,重新安装程序可能会解决此问题的 解决方案

本文主要介绍了由于找不到mfc110.dll,无法继续执行代码的解决方案,希望能对使用Windows的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 5万+

【数据库原理、编程与性能】Updata Transaction

文章目录1. Transaction Histories1.1 并发(Concurrency)1.2 并发操作会出现的DB问题1.3 并发控制技术1.4 封锁1.4.1 锁类型1.4.2 事务锁之间的相容矩阵1.5 Locking Protocol1.5.1 一级封锁协议1.5.2 二级封锁协议1.5.3 三级封锁协议2. Notations Transaction Histories2.1 Notations of Atomic Read and Write in DB2.2 举例3. Conflict

ccql's Blog 379

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

laravel mysql 锁表_mysql – 如何避免使用Laravel队列时DB表锁的问题?

这可能不是答案,但有些信息.当使用SELECT … FOR UPDATE语句时,可能会看到锁争用(死锁等).select … for update where x <= y该范围用< =数据库锁定所有行<= y,包括任何间隙所以如果你有这样的行:1,3,5它甚至锁定索引中1到3之间的空白空间其称为间隙锁定可以看到这个命令的问题:SHOW ENGINE INNODB STATUS;...

weixin_29798865的博客 449

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

数据库并发问题、事务隔离级别以及数据库锁

一、数据库并发问题     多用户数据库当多个用户同事操作数据库中的数据时可能会发生的并发问题,总结为以下三类:     1. 脏读(Dirty Reads):无效数据读出。     事务1修改了数据库中的一条数据,事务2读取并使用了这条数据,之后事务1出现异常(或其他原因)撤消了对数据的修改。正常情况事务1所操作的数据应该认为没发生任何变化,而实际事务2读取并使用的无效的数据。

Augus6的点点滴滴 1438

InnoDB锁问题

InnoDB锁相关

weixin_51789984的博客 884

【MySQL系列】记插入产生的死锁问题

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨。

优快云站内信: https://i.youkuaiyun.com/#/msg/chat/qyj19920704 3万+

深入理解Mysql事务隔离级别与锁机制

目录 概述 事务及其ACID属性 并发事务处理带来的问题 事务隔离级别 锁详解 锁分类 表锁 行锁 间隙锁(Gap Lock) 临键锁(Next-key Locks) 查看INFORMATION_SCHEMA系统库锁相关数据表 死锁 锁优化建议 概述 我们的数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能就会导致我们说的脏写、脏读、不可重复读、幻读这些问题。 这些问题的本质都是数据库的多事务并发问题,为了解决多事务并发问题,数据库设计

Xx__WangQi的博客 655

数据库事务与并发

多事务运行时的并发问题 数据库锁 共享锁 独占锁 更新锁 如何防止死锁 数据库事务隔离级别 多事务运行时的并发问题 第一类丢失更新:撤销一个事务时,把其他事务已提交的更新数据覆盖; 脏读:一个事务读到另一个事务未提交的更新数据; 虚读:一个事务读到另一个事务已提交的新插入的数据; 不可重复读:一个事务读到另一个事务已提交的更新数据; 第二类丢失更新:这是不可重复读中的...

谢凌宣 567

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

多事务运行并发问题 在实际应用中,往往是一台(或多台)服务器向无数客户程序提供服务,当服务器查询数据库获取数据时,如果没有采用必要的隔离机制,可能会存在数据库事务的并发问题,下面是一些常见的并发问题分类: 1. 第一类丢失更新:撤销一个事务,其他事务已提交的更新数据覆盖 2. 第二类丢失更新:一个事务覆盖另一个事务已提交的更新数据 3. 脏读:一个事务读到另一个事务未提交的数据 4. 虚...

weixin_30609331的博客 113

mysql死锁查询

背景 查监控发现线上时不时出现财务报表数据更新失败情况,追查日志发现,更新失败全部由于数据库死锁导致,日志报错“Deadlock found when trying to get lock”,经DBA查线上数据库日志,发现线上其他库表也存在死锁情况。 为了更系统的分析问题,将从问题定位、死锁成因分析,mysql锁知识这几个方面来展开讨论。 引起死锁的case 【定位问题】通过异常监控查看对应...

小人物 2922

攻城狮在路上(壹) Hibernate(十七)--- Hibernate并发处理问题

一、多个事务并发运行时的并发问题:  总结为第一类丢失更新、脏读、虚读、不可重复读、第二类丢失更新。  1、第一类丢失更新:撤销一个事务时,把其他事务已提交的更新数据覆盖。  2、脏读:一个事务读到另一个事务未提交的更新数据。  3、虚读(幻读):一个事务读到另一个事务已提交的新插入的数据。  4、不可重复读:一个事务读到另一个事务已提交的更新数据。  5、第二类丢失更新:这是...

164

oracle事务的隔离级别和锁

1. 事务的ACID特性: (1) 原子性 Atomicity: 事务所包含的数据库操作要么都做,要么都不做 (2) 一致性 Consistency: 数据库中只包含执行成功的结果,每个用户看到的数据是一致的 (3) 隔离性 Isolation: 事务对数据的操作不能够受到其他事务的影响 (4) 持续性 Durability: 数据库事务一旦提交,其对数据库中数据的改变应该是永久性的

技术人生 1万+

mysql数据库的行级锁有几种_Mysql 行级锁、表级锁、死锁

锁,在计算机中,是协调多个进程或线程并发访问某一资源的一种机制。在数据库当中,当数据库有并发事务的时候,可能会产生数据的不一致,这时候需要一些机制来保证访问的次序,锁机制就是这样的一个机制。就像酒店的房间,如果大家随意进出,就会出现多人抢夺同一个房间的情况,而在房间上装上锁,申请到钥匙的人才可以入住并且将房间锁起来,其他人只有等他使用完毕才可以再次使用。1、锁的分类从性能上分为乐观锁和悲观锁对数据...

weixin_33856202的博客 524

MySQL 事务隔离级别与锁机制详解

MySQL 事务隔离级别与锁机制详解

kerwin的博客 7427
上一篇: 数据库事务的四大特性以及事务的隔离级别整理
下一篇: JAVA并发编程总结
THMAIL
博客等级 码龄10年 2435粉丝 432原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

THMAIL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值