广告
返回顶部
首页 > 资讯 > 数据库 >数据库隔离级别
  • 228
分享到

数据库隔离级别

数据库隔离级别 2019-12-06 08:12:47 228人浏览 猪猪侠
摘要

数据库隔离级别 如果没有隔离级别会出现的问题 脏读 意思是读取到了事务正在修改的数据,如果事务回滚,那么拿到的数据就是错误的 时间 事务A 事务B 1 开始事务 2 读取quantity为5 3 修改qu

数据库隔离级别

数据库隔离级别

如果没有隔离级别会出现的问题

脏读

意思是读取到了事务正在修改的数据,如果事务回滚,那么拿到的数据就是错误的

时间 事务A 事务B
1 开始事务
2 读取quantity为5
3 修改quantity为4
4 开始事务
5 读取到quantity为4
6 发生错误,回滚,quantity为5
7 提交事务

在按照正常逻辑quantity应该为5

不可重复读

时间 事务A 事务B
1 开始事务
2 读取quantity为5
3 开始事务
4 修改quantity为4
5 提交事务
6 读取quantity为4
7 提交事务

在同一个事务内,两次读取同一个数据产生不一致

幻读

时间 事务A 事务B
1 开始事务
2 更新所有行的quantity为100
3 开始事务
4 插入一行quantity为5
5 提交事务
6 查询所有行的quantity
7 提交事务

当一个事务内更新所有行后,另一个事务插入了新行,当再次查看记录时,发现有未更新的记录,好像幻觉一样

丢失更新

第一种情况:

时间 事务A 事务B
1 开始事务
2 查询到quantity为10
3 开始事务
4 查询到quantity为10
5 更新quantity为11
6 提交事务
7 更新quantity为9
8 事务回滚,quantity为10

可以看到,回滚的事务把正常事务的数据覆盖了,正常事务的数据丢失了

第二种情况:

时间 事务A 事务B
1 开始事务
2 查询到quantity为10
3 开始事务
4 查询到quantity为10
5 更新quantity为9
6 提交事务
7 更新quantity为11
8 提交事务

这种情况是事务在执行期间,其他事务对数据进行了修改,那么当前事务拿到的数据就是错的,对错的数据进行更新,那也就没有意义了

解决方法

对于脏读、不可重复读、幻读

我们可以使用数据库提供的隔离级别来避免以上情况

隔离级别 脏读 不可重复读 幻读
Read-Uncommitted(读取未提交的内容)
Read-Committed(读取已提交的内容) ×
Repeatable-Read(可重读) × ×
Serializable(串行化) × × ×

Mysql的默认隔离级别为Repeatable-Read,可以通过以下命令查看

SELECT @@global.tx_isolation;--查看全局隔离级别
SELECT @@session.tx_isolation;--查看当前连接的隔离级别

修改隔离级别

SET @@global.tx_isolation="Read-Committed"
SET @@session.tx_isolation="Read-Committed"
--或
SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE

对于丢失更新

使用悲观

悲观锁主要有共享锁(读锁)和排他锁(写锁)

  • 共享锁是指多个事务可以共享一个一把锁,都可以读取到数据,但是不能修改
  • 排他锁就是一个事务获得了排他锁,那么其他事务就不能获得锁(包括共享锁和排他锁),获取排他锁的事务可以对数据进行访问和修改

mysql默认开启了自动事务提交,可以使用以下命令关闭

SET autocommit=0	--关闭自动事务提交

这里必须要强调一下锁的概念,不管是共享锁还是排他锁,都是我们给每一个数据元素加的,如果一个数据元素已经有了排他锁,那么久不能再给它加任何锁,如果一个数据元素有共享锁,那么还可以给它加共享锁,Mysql的InnoDB引擎默认给insert、update、delete都加了排他锁,而select未加任何锁

新建一个查询窗口,开始事务,但是没有提交,因为update默认给数据元素加排他锁,所以这个时候我们去更新该数据元素就会出现

上一个事务还没有提交,数据元素还有排他锁,这个update语句要给数据元素加排他锁,所以只有等待,这也验证了update语句默认会给相关的数据元素加排他锁

如果使用select语句加共享锁进行查询一样会阻塞

但是使用select语句不加任何锁是可以查出数据的,但是数据是更新之前的

所以,使用悲观锁在高并发情况下,对于减库存这样的操作,首先要使用排他锁的select语句拿到库存,如果已经有事务对这个数据元素上了锁,那么只有等待该事务释放锁,只有这样拿到的库存才是正确的

BEGIN;
DECLARE @now_quantity INT;
SELECT quantity INTO @now_quantity FROM item WHERE id=1 FOR UPDATE;//一定要加排他锁
UPDATE item SET quantity=@now_quantity-1 WHERE id=1;
COMMIT;

而且需要注意,MySQL InnoDB默认行级锁。行级锁都是基于索引的,如果一条SQL语句用不到索引是不会使用行级锁的,会使用表级锁把整张表锁住

使用悲观锁的方式解决丢失更新很简单,但是也会带来效率上的问题,如果一个事务上了锁,那么其他的都只有等待

使用乐观锁

我们可以给表中加上一个version自增的版本字段,查询的时候拿到版本字段和库存,当需要去更新的时候,如果版本不一致,那么需要重新查询,重复上述步骤,知道拿到的版本和数据库中的版本一致时,才进行更新,这样就不需要等待,效率更高


您可能感兴趣的文档:

--结束END--

本文标题: 数据库隔离级别

本文链接: https://www.lsjlt.com/news/5341.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 数据库隔离级别
    数据库隔离级别 如果没有隔离级别会出现的问题 脏读 意思是读取到了事务正在修改的数据,如果事务回滚,那么拿到的数据就是错误的 时间 事务A 事务B 1 开始事务 2 读取quantity为5 3 修改qu...
    99+
    2019-12-06
    数据库隔离级别
  • mysql数据库隔离级别详解
    目录隔离级别一、mysql有四个事务隔离级别二、为什么默认RR隔离级别?三、RR隔离级别下手动加锁解决幻读理论基础脏读、不可重复读、幻读 及其解决方法事务隔离级别命令行操作操作验证一、实现脏读二、操作验证--实现不可重复...
    99+
    2022-06-16
    mysql隔离级别是什么 数据库事务的四种隔离级别 mysql隔离级别设置
  • 数据库事务的隔离级别
    数据库事务的隔离级别有4种,由低到高分别为Read uncommitted 、Read committed 、Repeatable read 、Serializable 。而且,在事务的并发操作中可能会出现脏读,不可重复读,幻读。下面通过事...
    99+
    2014-06-29
    数据库事务的隔离级别 数据库入门 数据库基础教程 数据库 mysql
  • 数据库隔离级别有哪些
    小编给大家分享一下数据库隔离级别有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!数据库隔离级别包括:1、读未提交;2、读已提...
    99+
    2022-10-18
  • 数据库事务隔离的级别
    本篇内容介绍了“数据库事务隔离的级别”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1 概述与背景这是数据库...
    99+
    2022-10-18
  • 【数据库的四种隔离级别】
    在关系型数据库中,隔离级别是指多个事务并发执行时,彼此之间的隔离程度。数据库的四种隔离级别如下: 1.读未提交(Read Uncommitted): 最低级别的隔离级别,一个事务可以读取到另一个事务未提交的数据,可能会出现脏读、不可重复读和...
    99+
    2023-08-19
    数据库 java 开发语言
  • mysql数据库事务及隔离级别
    事务的四大特性: 原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用; 一致性: 执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的; 隔离性: 并发访问数据库时,一个用户的事务...
    99+
    2021-09-18
    mysql数据库事务及隔离级别
  • 数据库事务:ACID 和隔离级别
    一、什么是事务 事务是将多条 SQL 作为一个整体进行数据操作。这样能确保全部执行成功或全部执行失败,不改变任何数据。根据业务需求选择不同的存储引擎。对于那些不需要事务的查询类应用,选择非事务型的存储引擎能得到更高的性能,LOCK TABL...
    99+
    2016-06-16
    数据库事务:ACID 和隔离级别
  • 数据库中有哪些隔离级别
    数据库中有哪些隔离级别?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1,读未提交,Read Uncommited。指的是一个事务读取到另外一个...
    99+
    2022-10-18
  • spring数据库隔离级别是什么
    Spring框架提供了对数据库事务的支持,其中包括设置事务的隔离级别。数据库的隔离级别是指多个事务并发执行时,彼此之间的可见性和影响...
    99+
    2023-10-25
    spring 数据库
  • 详解MySQL 数据库隔离级别与MVCC
    Mysql是我们日常生产与学习中最常接触到的数据库之一,今天讲一讲在Mysql(或者说其他类似的数据库)中存在的隔离级别以及用来提高效率的多版本并发控制(MVCC)。 一、隔离级别 首先我们需要提到一个概念:事务。...
    99+
    2022-05-15
    MySQL 隔离级别 MySQL MVCC
  • 数据库事务隔离级别是什么
    这篇文章主要介绍了数据库事务隔离级别是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。数据库事务隔离级别:1、Read Uncommitt...
    99+
    2022-10-18
  • 数据库ACID原则和事务隔离级别
    数据库ACID原则A:原子性,AtomicityC:一致性,ConsistencyI:隔离性,IsolationD:持久性,Durability在mysql中的innodb引擎,原子性,一致性,隔离性通过r...
    99+
    2022-10-18
  • 什么是Mysql数据库的四类隔离级别
    下文给大家带来关于什么是Mysql数据库的四类隔离级别,感兴趣的话就一起来看看这篇文章吧,相信看完什么是Mysql数据库的四类隔离级别对大家多少有点帮助吧。一、简介由MySQL AB公司开发,是最流行的开放...
    99+
    2022-10-18
  • 数据库中事务的隔离级别是什么
    数据库中事务的隔离级别是什么?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。MySQL 事务主要用于处理操作量大,复杂度高的数据...
    99+
    2022-10-18
  • 数据库的事务隔离级别怎么理解
    本篇内容主要讲解“数据库的事务隔离级别怎么理解”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“数据库的事务隔离级别怎么理解”吧!在MVCC并发控制中,读操作可以分...
    99+
    2022-10-19
  • 事务隔离性和隔离级别
    隔离性是当多个用户并发访问数据库时,比如同时操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离 事务的隔离级别有哪些? 一、概念 Read uncommitted(读未提交) Read ...
    99+
    2021-04-27
    事务隔离性和隔离级别
  • MySQL数据中有哪些数据隔离级别
    小编给大家分享一下MySQL数据中有哪些数据隔离级别,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!    &...
    99+
    2022-10-18
  • mysql数据库四种事务隔离级别是什么
    这篇文章主要介绍了mysql数据库四种事务隔离级别是什么,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。熟悉 mysql 数据库四种事务隔离级别:...
    99+
    2022-10-18
  • 数据库事务的四大特性和隔离级别
    数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么全部执行,要么全部都不执行。一个逻辑工作单元要成为事务,必须满足事务的四大特性(ACID)。即原子性(...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作