MySQL-事务
-
事务定义
- 事务就是一组原子性的SQL查询语句,要么全部执行成功、要么全部执行失败。
-
ACID
-
一个良好的事务数据库系统,必须具备ACID特性。
-
原子性(Atomicity) 要么全部执行、要么全部不执行 一致性(Consistency) 事务开始和结束时,数据必须保证一致性 隔离性(Isolation) 事务处理过程中、中间状态对其他事务不可见 持久性(Durability) 事务完成后、它对数据的修改时永久性的
-
-
事务隔离级别
-
MySQL有四种隔离级别。
-
Read Uncommitted读未提交 所有事务可以看到其他未提交事务的执行结果 Read Committed读已提交 事务只能看到已提交事务所做的改动 Repeatable Read可重复读 默认的隔离级别 Serializable串行 强制事务排序、一次只执行一个事务
-
-
并发问题
-
Redo Log
- Redo Log被称作重做日志,用于记录事务操作变化,记录数据修改后的值,保证断电恢复。
- 由内存中的重做日志缓冲、重做日志文件构成。
- 在实际数据文件的修改落盘之前redo日志已经落盘,从而来保证事务的持久性。
- 在事务中发送修改时,将修改更新到内存后,会在重做日志缓冲添加此修改的操作记录,等到提交事务时,会将重做日志缓冲添加的记录的状态都置为commit状态,之后根据写入策略将commit的记录写入磁盘中的重做日志文件中,此时事务commit成功,并在之后慢慢将数据刷入硬盘中。
- 因此即使数据库断电,提交成功的事务也已经存入硬盘中的重做日志文件中了。
-
Binlog
- Binlog记录了所有的DDL和DML语句,但不包括select、show等查询语句。
- Binlog用于:数据恢复、主从复制、审计数据变化。
- 可通过设置来决定多久刷新一次到硬盘中。
- 先写redolog后写binlog,提交后再将redolog记录改为commit
-
Redo Log与Binlog
- (1)redo log的大小是固定,被刷入磁盘的日志会被覆盖掉,因此无法用于数据回滚/数据恢复等操作。binlog通过追加的方式写入的,可通过配置参数max_binlog_size设置每个binlog文件的大小,当文件大小大于给定值后,日志会发生滚动,之后的日志记录到新的文件上。
- (2)redo log是innodb引擎层实现的,并不是所有引擎都有。binlog是server层实现的,意味着所有引擎都可以使用binlog日志
-
Undo Log
- Redo Log记录了事务操作变化,用于回滚。
- 用于MVCC,读取一行记录时,若已被其他事务占据,则通过undo读取之前的版本。
- 数据行中存在一个undo log的指针,指向之前历史数据在undo log中的位置。
-
MVCC