首页 > 数据库 >MYSQL锁-写写情况,读写情况

MYSQL锁-写写情况,读写情况

时间:2022-10-23 12:33:04浏览次数:53  
标签:事务 记录 读写 ReadView 写写 并发 版本 MYSQL 数据库

锁为什么会存在 锁是计算机协调多个进程或线程并发访问某一资源的机制。在程序开发中会存在多线程同步的问题,当多个线程并发访问某个数据的时候,尤其是针对一些敏感的数据(比如订单、金额等),就需要保证这个数据在任何时刻最多只有一个线程在访问,保证数据的完整性和一致性。在开发过程中加锁是为了保证数据的一致性,这个思想在数据库领域中同样很重要。

在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。为保证数据的一致性,需要对并发操作进行控制,因此产生了锁。同时锁机制也为实现MySQL的各个隔离级别提供了保证。锁冲突也是影响数据库并发访问性能的一个重要因素。所以锁对数据库而言显得尤其重要,也更加复杂。

MySQL并发事务访问相同记录 读-读情况 读-读 情况,即并发事务相继 读取相同的记录 。读取操作本身不会对记录有任何影响,并不会引起什么问题,所以允许这种情况的发生。

写-写情况 写-写 情况,即并发事务相继对相同的记录做出改动。

在这种情况下会发生 脏写 的问题,任何一种隔离级别都不允许这种问题的发生。所以在多个未提交事务相继对一条记录做改动时,需要让它们 排队执行 ,这个排队的过程其实是通过 锁 来实现的。这个所谓的锁其实是一个 内存中的结构 ,在事务执行前本来是没有锁的,也就是说一开始是没有 锁结构 和记录进行关联的。

读-写或写-读情况 读-写 或 写-读 ,即一个事务进行读取操作,另一个进行改动操作。这种情况下可能发生 脏读 、 不可重复读 、 幻读 的问题。 各个数据库厂商对 SQL标准 的支持都可能不一样。比如MySQL在 REPEATABLE READ 隔离级别上就已经解决了 幻读 问题。

并发问题解决方案 方案一:读操作利用多版本并发控制( MVCC ,下章讲解),写操作进行 加锁 。

所谓的MVCC,就是生成一个ReadView,通过ReadView找到符合条件的记录版本((历史版本由undo日志构建)。查询语句只能读到在生成ReadView之前已提交事务所做的更改,在生成ReadView之前未提交的事务或者之后才开启的事务所做的更改是看不到的。而写操作肯定针对的是最新版本的记录,读记录的历史版本和改动记录的最新版本本身并不冲突,也就是采用MVCC时,读-写操作并不冲突 ——————————————

标签:事务,记录,读写,ReadView,写写,并发,版本,MYSQL,数据库
From: https://blog.51cto.com/wangwenfeng/5787277

相关文章

  • MySQL的Access deny问题
    navicat无法远程访问连接。1.3306端口要开2.服务器的数据库默认只允许本地访问,要改,设置成允许外部连接,先进入数据库usemysql改updateusersethost='%'whereuser......
  • Windows下安装MySQL
    安装教程(1)配置环境变量变量名:MYSQL_HOME变量值:D:\Env\mysql-8.0.30(2)在安装目录下生成data目录以管理员身份运行cmd进入D:\Env\mysql-8.0.30\bin>执行命令:mysqld-......
  • 三个MySQL查询容易踩的坑
    在使用MySQL的过程中,相比大家都踩过不少坑,下面我将列举日常生活中比较高频的三个”坑“,也欢迎大家踊跃分享自己的心路历程......
  • Mysql之数据结构
    1.Hash哈希表是键值对的集合,通过键(key)值即可快速的取出对应的值(value),因此hash表查询的速度很快。但是,哈希算法有hash冲突的问题,也就是说多个不同的key最后得到的index相同......
  • 记录安装mysql中的一些坑
    5.6版本一下,初始化。不要加参数--initinizie进入后可以直接进行修改密码。第二注意client和mysqld的sock文件必须指定同一个文件夹。第一步下载mysql安装包第二步解压......
  • (转)MySQL 创建函数报错 This function has none of DETERMINISTIC, NO SQL, or READS
    原文地址:https://www.cnblogs.com/miracle-luna/p/14760051.html 在MySQL中创建函数时,报错如下:ThisfunctionhasnoneofDETERMINISTIC,NOSQL,orREADSSQLDATA......
  • android连接mysql
    导入Mysql的jar,和rxjavaimplementation"io.reactivex.rxjava2:rxjava:2.2.10"implementation"io.reactivex.rxjava2:rxandroid:2.0.2" 创建DBOpenHelper......
  • docker部署mysql8.0
    linux环境下基于docker部署并配置mysql8.0环境docker-18.06.0192.168.12.220002主192.168.12.320004从1.#下载mysql的版本dockerpullmysql:8.0.222.#创......
  • mysql(分页表,日期.表连接,事务,索引,视图,备份)
    1.分页:limirm,n(一般放最后,其次在排序)m:表示从第几条数据开始显示(0表示第一天数据)n:表示每页显示的数据条数公式m=(pageNo-1)*pangeSizepageNo:表示显示的第......
  • SpringBoot 创建项目连接mysql数据库
    Spring 创建项目1.创建一个springboot项目2.点击File---- New---- project项目名称可以随便填写...3. Springboot版本尽量不要最新版,怕你们驾驭不了......