MYSQL事务

事务概述

事务是访问和更新数据的程序执行单元,事务中可能含有一个或多个SQL语句,这些语句要么全部执行,要么都不执行。

事务日志

MySQL七种日志介绍

bin log

归档日志(bin log):bin log是一种数据库Server层(和什么引擎无关),以二进制形式存储在磁盘中的逻辑日志。bin log记录了数据库所有DDL和DML操作(不包含 SELECT 和 SHOW等命令,因为这类操作对数据本身并没有修改)

error log

错误日志(error log): 应该是 MySQL 中最好理解的一种日志,主要记录 MySQL 服务器每次启动和停止的时间以及诊断和出错信息。
默认情况下,该日志功能是开启的,通过如下命令查找错误日志文件的存放路径。
注意:错误日志中记录的可并非全是错误信息,像 MySQL 如何启动 InnoDB 的表空间文件、如何初始化自己的存储引擎,初始化 buffer pool 等等,这些也记录在错误日志文件中。

relay log

中继日志(relay log):relay log日志文件具有与bin log日志文件相同的格式,从上边MySQL主从复制的流程可以看出,relay log起到一个中转的作用,slave先从主库master读取二进制日志数据,写入从库本地,后续再异步由SQL线程读取解析relay log为对应的SQL命令执行。

slow query log

慢查询日志:
慢查询日志(slow query log): 用来记录在 MySQL 中执行时间超过指定时间的查询语句,在 SQL 优化过程中会经常使用到。通过慢查询日志,我们可以查找出哪些查询语句的执行效率低,耗时严重。
出于性能方面的考虑,一般只有在排查慢SQL、调试参数时才会开启,默认情况下,慢查询日志功能是关闭的

general query log

一般查询日志:一般查询日志(general query log):用来记录用户的所有操作,包括客户端何时连接了服务器、客户端发送的所有SQL以及其他事件,比如 MySQL 服务启动和关闭等等。MySQL服务器会按照它接收到语句的先后顺序写入日志文件。
由于一般查询日志记录的内容过于详细,开启后 Log 文件的体量会非常庞大,所以出于对性能的考虑,默认情况下,该日志功能是关闭的,通常会在排查故障需获得详细日志的时候才会临时开启。

redo log

redo log(重做日志) :redo log属于MySQL存储引擎InnoDB的事务日志。redo log用到了WAL(Write-Ahead Logging)技术,这个技术的核心就在于修改记录前,一定要先写日志,并保证日志先落盘,才能算事务提交完成。
有了redo log再修改数据时,InnoDB引擎会把更新记录先写在redo log中,在修改Buffer Pool中的数据,当提交事务时,调用fsync把redo log刷入磁盘。至于缓存中更新的数据文件何时刷入磁盘,则由后台线程异步处理。

undo log

undo log(回滚日志):undo log也是属于MySQL存储引擎InnoDB的事务日志。
undo log属于逻辑日志,如其名主要起到回滚的作用,它是保证事务原子性的关键。记录的是数据修改前的状态,在数据修改的流程中,同时会记录一条与当前操作相反的逻辑日志到undo log中。

事务特性

事务的四个性值:ACID(原子性,一致性,隔离性和持久性)

原子性

原子性:事务中包含有很多操作,这些操作要么全部执行,要么全部不执行,所以支持回滚操作。

实现原理:undo log

持久性

持久性:事务的操作对数据库的影响时持久的。

实现原理:redo log

隔离性

并行事务的问题

1、脏读:
又称无效数据的读出,是指在数据库访问中,事务T1将某一值修改但是还未提交,然后事务T2读取该值,此后T1因为某种原因撤销对该值的修改并提交,这就导致了T2所读取到的数据是无效的,值得注意的是,脏读一般是针对于update操作的。

2、不可重复读:
是指在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。在一个事务内,多次读同一个数据。在这个事务还没有结束时,另一个事务也访问该同一数据并修改数据。那么,在第一个事务的两次读数据之间。由于另一个事务的修改,那么第一个事务两次读到的数据可能不一样,这样就发生了在一个事务内两次读到的数据是不一样的,因此称为不可重复读,即原始读取不可重复。

3,幻读:
事务A 按照一定条件进行数据读取, 期间事务B 插入了相同搜索条件的新数据,事务A再次按照原先条件进行读取时,发现了事务B 新插入的数据称为幻读。

不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

四种隔离级别

隔离级别脏读不可重复读幻读
读未提交(read-uncommitted)
读提交(read-committed)
可重读(repeatable-read)
可串行化(serializable)

read-uncommitted 读未提交:
在该级别,所有的事务都可以看到其他未提交事务的执行结果,本隔离级别很少用于实际应用,因为它的性能不比其他级别好多少。读取未提交的数据,也称之为脏读。
没有加任何锁,存在脏读、不可重复读和幻读问题。

read-committed 读提交内容:

这是大多数数据库系统的默认隔离级别(但不是MYSQL默认的),它满足了隔离的简单定义:一个事务只能看见已提交事务所做的改变。也支持所谓的不可重复读。
对读取的数据加共享锁,可以避免脏读,但不可重复读和幻读仍可能存在。

repeatable-read 可重读:

是MYSQL默认的,确保统一事务的多个实例在并发读取数据时,会看到同样的数据行。
对读取的数据加共享锁,对用到的查询条件加共享锁,可以避免脏读和不可重复读,但幻读仍可能存在。

serializable 可串行化:

这是最高的隔离级别,他通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简而言之,他是在每个读的数据行上加上共享锁。在这个级别可能导致大量的超时现象和锁竞争。
对读取的数据和查询条件都加排他锁,可以防止脏读、不可重复读和幻读,但并发性最低。

低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。

实现原理:锁机制

MYSQL锁机制

一致性

4、一致性:系统从一种一致性到另一种一致性状态。事物的一致性决定了一个系统设计和实现的复杂度。事务可以具有不同程度的一致性。

强一致性:读操作可以立即读到操作的更新操作。

弱一致性:提交的更新操作不一定立即会被读操作读到,这种情况会存在一个不一致窗口,指的是读操作可以读到最新值的一段时间。

最终一致性:(弱一致性的一种特殊情况)最终所有的事务都会读到之前事务更新的最新值。

实现原理:原子性、持久性和隔离性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值