Mysql实战45讲学习详情----为什么你改了我还看不见?

相关词汇:

  MyISAM:MySQL原生引擎(不支持事务)

  InnoDB:第三方引擎(支持事务)

  ACID(Atomicity、Consistency、Isolation、Durability):原子性、一致性、隔离性、持久性

  MVCC:数据库的多版本并发控制

事务的概念:

  事务就是要保证一组数据库操作,要么全部成功,要么全部失败。

当数据库上有多个事务同时执行时,会出现脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)的问题,为了解决这些就需要“隔离级别”这个概念。

  隔离级别:

    隔离级别越高效率越低。四种级别依次往下,级别越高,效率越低,安全性越高。

      【官方解释】

      读未提交是指,一个事务还没提交时,它做的变更就能被别的事务看到。

      读提交是指,一个事务提交之后,它做的变更才会被其他事务看到。

      可重复读是指,一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的。

      串行化,顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。

      【个人理解】

      1.读未提交:你的事务还没提交,我在我的事务中也能查到你的结果

      2.读提交:你的事务提交之后,我在我的事务中才能查到你的结果

      3.可重复度:我的事务提交之前,我看到的数据是不会变的,你的事务不论提交还是不提交我都不去管

      4.串行化:我的事务没提交,谁都不能动我的数据

    实现形式(数据库里面会创建一个视图,访问的时候以视图的逻辑结果为准):

      ①读未提交:直接返回最新值,没有视图概念

      ②读提交:在没条sql语句开始执行的时候创建视图

      ③可重复读:事务启动的时候创建视图

      ④串行化:用加锁的方式避免并行访问

    设置隔离级别:

      将启动参数 transaction-isolation 的值设置成 READ-COMMITTED

      (将隔离级别设置为读提交)

        -- 查看参数“transaction_isolation”的值:

          show variables like ‘transaction_isolation‘;

        --修改参数“transaction_isolation”的值为“READ-COMMITTED”:

          | transaction_isolation | READ-COMMITTED |

    【可重复读隔离级别的应用场景】核对账单时,用户发生一笔交易,此时用可重复读的隔离级别,视图不会发生变化,不受其他事物影响。

事务隔离的实现:

  每条记录更新的时候都会同时记录一条回滚操作,记录的最新值通过回滚操作,都可以得到前一个状态的值。

  同一条记录在系统中可以存在多个版本,就是数据库的多版本并发控制(MVCC)。

  

  

  回滚日志什么时候删除呢?

    在不需要的时候删除。

  那什么时候不需要了呢?

    就是当系统里没有比这个回滚日志更早的 read-view 的时候。

  那为什么不建议用长事务呢?

    长事务意味着系统里面会存在很老的事务视图。由于这些事务随时可能访问数据库里面的任何数据,所以这个事务提交之前,数据库里面它可能用到的回滚记录都必须保留,这就会导致大量占用存储空间。

MySQL的事务启动方式:

  1.显式启动事务语句, begin 或 start transaction。配套的提交语句是 commit,回滚语句是 rollback。

  2.set autocommit=0,这个命令会将这个线程的自动提交关掉。意味着如果你只执行一个 select 语句,这个事务就启动了,而且并不会自动提交。这个事务持续存在直到你主动执行 commit 或 rollback 语句,或者断开连接。

      有些客户端连接框架会默认连接成功后先执行一个 set autocommit=0 的命令。这就导致接下来的查询都在事务中,如果是长连接,就导致了意外的长事务。

      因此建议总是使用 set autocommit=1, 通过显式语句的方式来启动事务。

      PS:在 autocommit 为 1 的情况下,用 begin 显式启动的事务,如果执行 commit 则提交事务。如果执行 commit work and chain,则是提交事务并自动启动下一个事务,这样也省去了再次执行 begin 语句的开销。同时带来的好处是从程序开发的角度明确地知道每个语句是否处于事务中。

    可以在 information_schema 库的 innodb_trx 这个表中查询长事务,比如下面这个语句,用于查找持续时间超过 60s 的事务。
      select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(),trx_started))>60

附加解释:

脏读:
当数据库中一个事务A正在修改一个数据但是还未提交或者回滚,
另一个事务B 来读取了修改后的内容并且使用了,之后事务A提交了,此时就引起了脏读。
此情况仅会发生在: 读未提交的的隔离级别.

不可重复读:
在一个事务A中多次操作数据,在事务操作过程中(未最终提交),
事务B也才做了处理,并且该值发生了改变,这时候就会导致A在事务操作的时候,发现数据与第一次不一样了。 就是不可重复读。
此情况仅会发生在:读未提交、读提交的隔离级别.

幻读:
一个事务按相同的查询条件重新读取以前检索过的数据,
却发现其他事务插入了满足其查询条件的新数据,这种现象就称为幻读。

此情况会回发生在:读未提交、读提交、可重复读的隔离级别.

附加问题:

  现在知道了系统里面应该避免长事务,如果你是业务开发负责人同时也是数据库负责人,你会有什么方案来避免出现或者处理这种情况呢?

【个人理解】

  开发时缩小事务范围,使用 set autocommit=1, 通过显式语句的方式来启动事务,监控innodb_trx表,发现长事务及时处理。

原文地址:https://www.cnblogs.com/lvzhenhua/p/12653607.html

时间: 2024-08-30 12:58:41

Mysql实战45讲学习详情----为什么你改了我还看不见?的相关文章

Mysql实战45讲学习详情----一条SQL更新语句是如何执行的?

相关词语: redo log:日志模块(临时记录,类似于便签),InnoDB 引擎特有日志 WAL(Write-Ahead Logging):写入方式 binlog:日志模块(归档日志),Server 层的日志 crash-safe:redo log带来的好处(MySQL 可以恢复到固定时间内任意一秒的状态) WAL执行过程(redo log日志的存储方式): write pos 是当前记录的位置,checkpoint 是当前要擦除的位置,它们之间的是“便签”上还空着的部分.如果 write p

03 | 事务隔离:为什么你改了我还看不见?学习记录

<MySQL实战45讲>03 | 事务隔离:为什么你改了我还看不见?学习记录http://naotu.baidu.com/file/294c6d886a620d10a3f921a2744a93b4?token=7381babc958c866e 原文地址:https://www.cnblogs.com/jtfr/p/11248699.html

极客时间-MySQL实战45讲(实践篇)2

20 | 幻读是什么,幻读有什么问题? InnoDB 的默认事务隔离级别是可重复读--rr 快照读(snapshot read) 单纯的select操作,不包括上述 select ... lock in share mode, select ... for update. Read Committed隔离级别:每次select都生成一个快照读. Read Repeatable隔离级别:开启事务后第一个select语句才是快照读的地方,而不是一开启事务就快照读. 快照读的实现方式:undolog和

MySQL实战45讲

1. 锁分类 MySQL中主要分为全局锁.表级锁和行锁三类.本篇主要涉及全局锁和表级锁. 2. 全局锁 全局锁是对整个数据库实例进行加锁. Flush table with read lock(FRTWRL)该命令用于加全局锁.使用该命令之后,整个库处于只读状态,不能执行数据的增删改查.建表.修改表和更新类事务的提交操作. 使用命令unlock tables接触锁. 全局锁的典型使用场景是做全库的数据备份.不加全局锁备份的话,备份系统拿到的不是一个逻辑时间点的库,这个视图逻辑是不一致的. 在可重

MySQL实战 | 01-当执行一条 select 语句时,MySQL 到底做了啥?

原文链接:当执行一条 select 语句时,MySQL 到底做了啥? 也许,你也跟我一样,在遇到数据库问题时,总时茫然失措,想重启解决问题,又怕导致数据丢失,更怕重启失败,影响业务. 就算重启成功了,对于问题的原因仍不知所以. 本文开始,记录学习<MySQL实战45讲>专栏的过程. 也许有人会问,你记录有什么意义?直接看专栏不就行了吗?你这不是啃别人的剩骨头吗? 是的,这个系列,我只是基于专栏学习,但是我会尽量从我的角度搞懂每一个知识点,遇到不懂得也会将知识点进行拆分. 我知道关注公众号的小伙

Scala 深入浅出实战经典 第45讲: scala中context bounds代码实例

王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2 技术爱好者尤其是大数据爱好者 可以加DT大数据梦工厂的qq群 DT大数据梦工厂① :462923555 DT大数据梦工厂②:437123764 DT大数据梦工厂③

第131讲:Hadoop集群管理工具均衡器Balancer 实战详解学习笔记

第131讲:Hadoop集群管理工具均衡器Balancer 实战详解学习笔记 为什么需要均衡器呢? 随着集群运行,具体hdfs各个数据存储节点上的block可能分布得越来越不均衡,会导致运行作业时降低mapreduce的本地性. 分布式计算中精髓性的一名话:数据不动代码动.降低本地性对性能的影响是致使的,而且不能充分利用集群的资源,因为导致任务计算会集中在部分datanode上,更易导致故障. balancer是hadoop的一个守护进程.会将block从忙的datanode移动到闲的datan

第130讲:Hadoop集群管理工具DataBlockScanner 实战详解学习笔记

第130讲:Hadoop集群管理工具DataBlockScanner 实战详解学习笔记 DataBlockScanner在datanode上运行的block扫描器,定期检测当前datanode节点上所有的block,从而在客户端读到有问题的块前及时检测和修复有问题的块. 它有所有维护的块的列表,通过对块的列表依次的扫描,查看是否有校验问题或错误问题,它还有截流机制. 什么叫截流机制?DataBlockScanner扫描时会消耗大量的磁盘带宽,如果占用磁盘带宽太大,会有性能问题.所以它会只占用一小

入门实战《深度学习技术图像处理入门》+《视觉SLAM十四讲从理论到实践》

学习图像识别处理,想在数据分析竞赛中取得较高的排名,看了<深度学习技术图像处理入门>电子书,一边看电子书一边做标记,对配套的代码也做了测试,收获颇多. 从机器学习.图像处理的基本概念入手,逐步阐述深度学习图像处理技术的基本原理以及简单的实现. 学习理论后做实验,使用卷积神经网络进行端到端学习,构建深度卷积神经网络,使用循环神经网络改进模型,评估模型,测试模型.最关键的是可以将模型运用于实战之中,将深度学习模型导入到工程中,数据类型转换函数,实施CAM可视化,这是我最需要的. 视觉和图形学真是一