首页 > 数据库 >MySQL-(InnoDB)事务和锁

MySQL-(InnoDB)事务和锁

时间:2022-12-30 12:22:22浏览次数:58  
标签:事务 隔离 READ 幻读 REPEATABLE InnoDB MySQL 级别

在事务并行处理背景下,不同的事务之间因数据共享的状态变化,存在着某种依赖/隔离影响。即事务隔离级别。

事务隔离级别,官网的解释在这里

InnoDB提供 SQL:1992 标准描述的所有四种事务隔离级别: READ UNCOMMITTED、 READ COMMITTED、 REPEATABLE READ和 SERIALIZABLE。
InnoDB默认的隔离级别是 REPEATABLE READ。

 

READ UNCOMMITTED(未提交读):即一个事务可以读到另一个事务未提交的“中间状态”数据。也叫脏读。好比A和B在画画,A想看看B的绘画结果,

                                                               但是B还没画完,A就拍照走了。实际B的画没有完成;A只是拿了一个中间状态。

READ COMMITTED(提交读):即一个事务不可读到另一个事务未提交的“中间状态”数据。可以避免脏读。但是会发生两次读到的数据不一致问题。

                                                      也叫不可重复读。还是A和B画画举例,A在B画画之前读一次,B画完后读一次。A读了两次读到了不同的内容(想当然)。

REPEATABLE READ(可重复读):对不可重复读的改进(可以看到改进在一条条升级)。即两次读到的内容一致。举例来说,即A开始读B的画,

                                                           B即交笔停笔不允许改了。不管A读几次结果都一样。直到A结束他的读(事务)。

                                                           可重复读仍会产生幻读问题。

幻读这里有点绕,和不可重复读有点像。都是两次读到了不同的结果。不同的是:不可重复读强调查询结果的值的改变,幻读强调查询结果的范围出现了变化,

比如某行数据上一次查询没有,这一次突然出现--这是幻读问题。

The so-called phantom problem occurs within a transaction when the same query produces different sets of rows at different times. For example, if a SELECT is executed twice, but returns a row the second time that was not returned the first time, the row is a “phantom” row.

SERIALIZABLE(可串行化):强制事务进行排序,将并行事务改串行,可以解决脏读,不可重复读,幻读的问题,但是需要加锁。不是很友好。

 上面介绍了四种事务隔离级别和各隔离级别仍存在的问题,需要注意的是:READ UNCOMMITTED这种最低一级的隔离级别,相当于没有隔离,

实际应用中基本上不会用。SERIALIZABLE隔离级别会对每一行数据进行读写加锁,可能导致大量的超时和锁争用问题,实际应用中也很少用这个

隔离级别,除非接受没有并发,但我们也知道,基本不可能。

所以我们更多的讨论的是READ COMMITTED和REPEATABLE READ这两个事务隔离级别。

 

即在READ COMMITTED和REPEATABLE READ这两个事务隔离级别下,如何解决不可重复读和幻读的问题?

通过锁机制和MVCC。其中锁主要处理当前读相关问题,MVCC处理快照读相关问题。

 

mysql锁的分类 InnoDB Locking 

根据锁的覆盖范围,重点关注:表锁,行锁,间隙锁,临键(next-key)锁

 

MVCC部分待续。

 

附录总结一

**mysql事务(ACID)的实现原理:

原子性(Atomicity): undo log

一致性(Consistency):一致性是目的,原子性、隔离性、持久性是手段。实现AID三大特性才有可能实现一致性。

隔离性(Isolation): 写写:锁(行锁,表锁,间隙锁);写读:MVCC

持久性(Durability):redo log 

标签:事务,隔离,READ,幻读,REPEATABLE,InnoDB,MySQL,级别
From: https://www.cnblogs.com/hangwei/p/16994292.html

相关文章

  • MySQL复制常见报错处理【转】
    在日常工作中,笔者遇到过很多MySQL主从复制报错的情况,这篇文章就来聊一聊常见的一些复制报错,以及处理办法。1serverid重复这个在我们刚接触主从复制的时候可能会犯的错......
  • MySQL 复制延迟怎么处理【转】
    我们在工作过程中,可能多多少少会遇到主从延迟的情况,这一节内容我们就来聊聊什么情况可能出现主从延迟,怎样判断延迟,存在延迟怎么处理。根据笔者以往的经验,导致复制延迟可能......
  • mysql记录查询的sql
    showprocesslist;二、mysql查看已经执行的历史sql语句(方法:开启日志模式)开启日志SETGLOBALlog_output='TABLE';SETGLOBALgeneral_log='ON';查看是否开启showvaria......
  • MySQL 5.7 版本的安装及简单使用(图文教程)
    MySQL5.7版本的安装使用详细教程写得还是比较详细,甚至有些繁琐,有很多步骤在其他的教程文档里都是省略掉的,但是我还是要写出来,因为我当时走了很多弯路,我希望你们能够避免我......
  • MySQL数据库优化的八种方式(经典必看)MySQL数据库优化的八种方式(经典必看)
    MySQL数据库优化的八种方式(经典必看) MySQL/Oracle数据库优化总结(非常全面)置顶2017年08月21日21:05:30阅读数:8442MySQL数据库优化的八种方式(经典必看)引言: ​​关于......
  • mysql 关联查询速度慢 (解决)
     转载:https://blog.csdn.net/qq_48091113/article/details/122695260 1.记录原因:mysql关联查询速度很慢,是由于字段字符集规则不一致所导致1.1在一次线上的服务中,......
  • 10-Mysql注入漏洞
    手工注入:get:url中带参数xxx.asp/asp?id=123123单引号and1=1/-0baidu.com/xxx.php?id=12312string=hasdfsdstring=网站asp/aspxaccess/sqlserverpost:搜索框、登录、注册、......
  • mysql root 用户有多个密码
    mysql是用用户名+ip来区分用户的,如下,是三个不同的用户'username'@'localhost''username'@'127.0.0.1''username'@'%'在mysql,不同ip的同一用户尽量用同一个密码参......
  • 用Java开发出网站,在其中输入中文,但是保存到MySQL数据库中却是????
    前言:前两部分是从mysql和eclipse的角度去解决,在解决的过程中学到了之前没设计到的查看和修改数据库或数据表的字符集的知识。后一部分是掌握了前两步后,进行的新一轮解决问题......
  • 锦囊秘籍!用Python操作MySQL的使用教程集锦!
    一.python操作数据库介绍大家好,我是毕加锁(锁!)。Python标准数据库接口为PythonDB-API,PythonDB-API为开发人员提供了数据库应用编程接口。Python数据库接口支持非常多的......