推荐阅读:吊打面试官!MySQL灵魂100问,你能答出多少?

一、前言

只有InnoDB引擎支持事务,下边的内容均以InnoDB引擎为默认条件

二、常见的并发问题

1、脏读

一个事务读取了另一个事务未提交的数据

2、不可重复读

一个事务对同一数据的读取结果前后不一致。两次读取中间被其他事务修改了

3、幻读

幻读是指事务读取某个范围的数据时,因为其他事务的操作导致前后两次读取的结果不一致。幻读和不可重复读的区别在于,不可重复读是针对确定的某一行数据而言,而幻读是针对不确定的多行数据。因而幻读通常出现在带有查询条件的范围查询中

三、事务隔离级别

1、读未提交(READ UNCOMMITTED)

可能产生脏读、不可重复读、幻读

2、读已提交(READ COMMITTED)

避免了脏读,可能产生不可重复读、幻读

3、可重复读(REPEATABLE READ)(mysql默认隔离级别)

避免了脏读,不可重复读。通过区间锁技术避免了幻读

4、串行化(SERIALIZABLE)

串行化可以避免所有可能出现的并发异常,但是会极大的降低系统的并发处理能力

四、数据库日志有哪些?

1、undo日志

undo日志用于存放数据修改被修改前的值

UNDO LOG中分为两种类型,一种是 INSERT_UNDO(INSERT操作),记录插入的唯一键值;

一种是 UPDATE_UNDO(包含UPDATE及DELETE操作),记录修改的唯一键值以及old column记录。

2、redo日志

mysql会将一个事务中的所有sq先l记录到redo log中,然后再将记录从redo log同步到数据文件中

它可以带来这些好处:

  • 当buffer pool中的dirty page 还没有刷新到磁盘的时候,发生crash,启动服务后,可通过redo log 找到需要重新刷新到磁盘文件的记录;
  • buffer pool中的数据直接flush到disk file,是一个随机IO,效率较差,而把buffer pool中的数据记录到redo log,是一个顺序IO,可以提高事务提交的速度;

3、binlog日志

用于数据库主从复制的记录,是二进制格式。在事务提交之后进行一个磁盘写入。

这里注意下redo log 跟binary log 的区别,redo log 是存储引擎层产生的,而binary log是数据库层产生的。假设一个大事务,对tba做10万行的记录插入,在这个过程中,一直不断的往redo log顺序记录,而binary log不会记录,直到这个事务提交,才会一次写入到binary log文件中

五、数据库事务控制

1、默认情况下,开启事务自动提交功能。每执行一个sql,都会对应一个事务的提交

2、spring会将底层连接的自动提交特性设置为false。使用手动提交

六、事务的ACID特性

1、原子性(Atomicity)

事务中的所有操作作为一个整体像原子一样不可分割,要么全部成功,要么全部失败。

2、一致性(Consistency)

事务的执行结果必须使数据库从一个一致性状态到另一个一致性状态。一致性状态是指:1.系统的状态满足数据的完整性约束(主码,参照完整性,check约束等) 2.系统的状态反应数据库本应描述的现实世界的真实状态,比如转账前后两个账户的金额总和应该保持不变。

3、隔离性(Isolation)

并发执行的事务不会相互影响,其对数据库的影响和它们串行执行时一样。比如多个用户同时往一个账户转账,最后账户的结果应该和他们按先后次序转账的结果一样。

4、持久性(Durability)

事务一旦提交,其对数据库的更新就是持久的。任何事务或系统故障都不会导致数据丢失。

5、redo log和undo log实现了原子性、一致性、持久性

6、锁机制实现了隔离性

6.1、快照读

读取的是快照版本,也就是历史版本。普通的SELECT就是快照读

6.2、当前读

读取的是最新版本。UPDATE、DELETE、INSERT、SELECT ... LOCK IN SHARE MODE、SELECT ... FOR UPDATE是当前读。

6.3、锁定读

在一个事务中,标准的SELECT语句是不会加锁,但是有两种情况例外。SELECT ... LOCK IN SHARE MODE 和 SELECT ... FOR UPDATE。

SELECT ... LOCK IN SHARE MODE

给记录假设共享锁,这样一来的话,其它事务只能读不能修改,直到当前事务提交

SELECT ... FOR UPDATE

给索引记录加锁,这种情况下跟UPDATE的加锁情况是一样的

6.4、一致性非锁定读

consistent read(一致性读),InnoDB用多版本来提供查询数据库在某个时间点的快照。如果隔离级别是REPEATABLE READ,那么在同一个事务中的所有一致性读都读的是事务中第一个这样的读读到的快照;如果是READ COMMITTED,那么一个事务中的每一个一致性读都会读到它自己刷新的快照版本。Consistent read(一致性读)是READ COMMITTED和REPEATABLE READ隔离级别下普通SELECT语句默认的模式。一致性读不会给它所访问的表加任何形式的锁,因此其它事务可以同时并发的修改它们。

关注我,后续更多干货奉上!

事务复制提示初始快照不可用_「MySQL」数据库事务深入分析相关推荐

  1. 事务复制提示初始快照不可用_谈谈数据库的事务ACID

    在数据库中新建一个字段并且设置为索引列,还有删除整张表的数据,类似这些操作都是一系列操作的组合,执行后不能出现中间状态,也就是不会出现新建了字段却不是索引的情况,也不会出现只有一部分数据被删除的情况. ...

  2. 「DB」数据库事务的隔离级别

    2019独角兽企业重金招聘Python工程师标准>>> 数据库事务的隔离级别 讲事务的隔离级别之前,先来介绍一下数据库事务的几个特性: (1)原子性 最基本的特性,意思是在一个事务内 ...

  3. mysql 递归_「MySQL」 - SQL Cheat Sheet - 未完成

    近几个月的心情真是安排的妥妥的,呈现W状.多的不说了,这里对SQL的测试进行简单梳理,制作一份SQL Cheat Sheet. 0x01.数据库基本架构 Clinet层 Server层 连接器 网络连 ...

  4. mysqlclient==1.3.7对应mysql版本_「MySQL」CentOs 7 下安装MySQL

    MySQL MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管 ...

  5. PHP事务数据库写法,PHP 操作 MySQL 执行数据库事务

    $mysqli=new mysqli();//实例化mysqli $mysqli->connect('localhost','root','admin','test'); if(mysqli_c ...

  6. mysql 查询事务信息_查看MySQL最近的事务执行信息

    查看MySQL最近的事务执行信息 发布时间:2020-03-03 12:35:07 来源:51CTO 阅读:103 作者:wjw555 课题:查看MySQL最近的事务执行信息 *虽然我们可以通过查询慢 ...

  7. mysql 事件里定义事物_聊一聊 MySQL 中的事务及其实现原理

    说到数据库,那就一定会聊到事务,事务也是面试中常问的问题,我们先来一个面试场景: 面试官:"事务的四大特性是什么?" 我:"ACID,即原子性(Atomicity).隔离 ...

  8. service和controller都加了事务_「Spring声明式事务」在service内部之间调用竟然失效啦?...

    在开发过程中你是否遇到过这样的问题,当在Controller中调用Service中A()方法,A方法内部又调用Service中B()方法,由于A方法中只有查询操作所以没有加事务控制,B方法中含有多次修 ...

  9. mysql4.0事务_聊一聊 MySQL 中的事务及其实现原理

    说到数据库,那就一定会聊到事务,事务也是面试中常问的问题,我们先来一个面试场景: 面试官:"事务的四大特性是什么?" 我:"ACID,即原子性(Atomicity).隔离 ...

最新文章

  1. 张孝祥Java培训视频及孙鑫java视频网址
  2. 使用tomcat的jndi方式连接mysql的字符编码设置
  3. 小白初学搭建 配置本地yum
  4. 屌丝程序员的返京历险记
  5. 记一次LVM修复过程
  6. RPM安装包-Spec文件參数具体解释与演示样例分析
  7. arcgis两点之间连线_使用ArcGIS制作城市关系强度图(附数据下载)
  8. 【Elasticsearch】如何解析集群命令
  9. 【Java从0到架构师】Spring - 整合 MyBatis
  10. OC 与 C++ 混编导致 ’string‘ not found
  11. php listen命令,开启队列时,命令行输入php think queue:listen出现乱码
  12. DSP课设项目(ICETEK-VC5509-EDU)
  13. 计算机启用远程桌面连接失败,解决办法:如何处理win10远程桌面连接失败?
  14. C# 串口接收含有asic2=0x3f时发生的故障
  15. GrapeCity Documents for Imaging
  16. windows下postgres数据库软件被损坏的情况下data文件存在恢复数据库
  17. 网络攻防实验:defcon2015 r0pbab
  18. Python合并不同数量的Excel单元格
  19. [乐意黎原创] JavaScript中数组使用总结
  20. 获取不带后缀名的Excel文件名Python

热门文章

  1. ubuntu安装hadoop2.9.2
  2. Python数据分析之全球人口数据
  3. Python之路---函数进阶
  4. 一些牛逼的Python程序整理
  5. 老司机教你 5 分钟读懂 Python 装饰器
  6. Python 必知的 20 个骚操作!
  7. HBase 架构详解
  8. 服务器控件在客户端触发alert对话框后,根据情况进行回发服务器操作
  9. ExtJs2.0学习系列(6)--Ext.FormPanel之第三式(ComboBox篇)
  10. 常用web服务列表(三)