ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
![](https://img.kancloud.cn/d9/ed/d9edeb022087974422bcf208791c8a0f_1094x469.png) ## 什么是事务? 事务是逻辑上的一组操作,要么都执行,要么都不执行 ## 事务的四大特性 原子性(Atomicity)、一致性(Consistent)、隔离性(Isalotion)、持久性(Durable)**,简称为`ACID` 1. **原子性**:是指事务的原子性操作,**对数据的修改要么全部执行成功,要么全部失败,实现事务的原子性,undo log保证** 2. **一致性**:是指**执行事务前后的状态要一致**,可以理解为数据一致性。**undo log+redo log保证** 3. **隔离性**:侧重指**事务之间相互隔离,不受影响**,这个与事务设置的隔离级别有密切的关系。**锁(共享、排他)+mvcc保证** 4. **持久性**:则是指在**一个事务提交后,这个事务的状态会被持久化到数据库中,也就是事务提交,对数据的新增、更新将会持久化到数据库中。redo log保证** Mysql默认的隔离级别:**可重复读**。 REPEATABLE-READ(可重读)**事务隔离级别下使用的是Next-Key Lock 锁算法,因此可以避免幻读的产生,这与其他数据库系统(如 SQL Server)是不同的。所以说InnoDB 存储引擎的默认支持的隔离级别是**REPEATABLE-READ(可重读)**已经可以完全保证事务的隔离性要求,即达到了 SQL标准的**SERIALIZABLE(可串行化) ## ## 隔离级别 **读未提交-读提交-可重复读-串行化**,**级别越来越高,隔离也就越来越严实,到最后的串行化,当出现读写锁冲突的时候,后面的事务只能等前面的事务完成后才能继续访问** 1. **读未提交:读取到别的事务还没有提交的数据,从而产生了脏读**。 2. **读提交:读取别的事务已经提交的数据,从而产生不可重复读。** 3. **可重复读:事务开启过程中看到的数据和事务刚开始看到的数据是一样的,从而产生幻读,在Mysql的中通过MVCC多版本控制的一致性视图解决了不可重复读问题以及通过间隙锁解决了幻读问题。** 4. **串行化:对于同一行记录,若是读写锁发生冲突,后面访问的事务只能等前面的事务执行完才能继续访问**。 不可重复读的重点是修改,幻读的重点在于新增或者删除 # MVCC ### 什么是MVCC MVCC是一种多版本并发控制机制 MVCC中规定**每一行数据都有多个不同的版本,一个事务更新操作完后就生成一个新的版本** ### MVCC是为了解决什么问题 * 大多数的MYSQL事务型存储引擎,如,InnoDB,Falcon以及PBXT都不使用一种简单的行锁机制.事实上,他们都和MVCC–多版本并发控制来一起使用. * 大家都应该知道,锁机制可以控制并发操作,但是其系统开销较大,而MVCC可以在大多数情况下代替行级锁,使用MVCC,能降低其系统开销. ### MVCC实现 MVCC是通过保存数据在某个时间点的快照来实现的. 不同存储引擎的MVCC. 不同存储引擎的MVCC实现是不同的,典型的有乐观并发控制和悲观并发控制. ### MVCC 具体实现分析(原理)   InnoDB的MVCC,是通过在每行记录后面保存两个隐藏的列来实现的,这两个列,分别保存了这个行的创建时间,一个保存的是行的删除时间。这里存储的并不是实际的时间值,而是系统版本号(可以理解为事务的ID),没开始一个新的事务,系统版本号就会自动递增,事务开始时刻的系统版本号会作为事务的ID. # 数据库日志 ## 1、mysql中的日志文件都有哪些 ①重做日志 redo log ②回滚日志 undo log ③二进制日志 bin log ④错误日志 error log ⑤慢查询日志 slow query log ⑥一般查询日志 general log ⑦中继日志 relay log ## Mysql中redolog 和 binlog的作用和区别 ①redolog属于物理日志,记录改数据页的更新状态内容 ②binlog属于逻辑日志,记录更新的操作语句的原始逻辑 ③redolog是循环写,日志的空间大小是固定的;binlog是追加写入,写完一个写下一个,不会进行数据的覆盖 ## 作为主从复制和数据恢复使用哪一个? redo log作为服务器异常宕机后事务数据自动恢复使用,binlog可以作为主从复制和数据恢复使用,binlog没有自动crash-safe的能力 ## bin log 作用:用于主从复制,实现主从同步 ## redo log 作用:确保日志的持久性,防止在发生故障,脏页未写入磁盘。重启数据库会进行redo log执行重做,达到事务一致性 ## undo log 作用:保证数据的原子性,记录事务发生之前的一个版本,用于回滚,innodb事务可重复读和读取已提交 隔离级别就是通过mvcc+undo实现 ## relay log 作用:用于数据库主从同步,将主库发来的bin log保存在本地,然后从库进行回放