1.redo log 是InnoDB引擎特有的日志 循环写入固定大小内存
2.WAL,先写日志再写磁盘数据库
innodb_flush_log_at_trx_commit 参数 决定写磁盘时机
设置为1: 系统默认模式,每次事务提交时MySQL都会把log buffer的数据写入log file,而且flush(刷到磁盘)中缓存
追加写入文件,到达指定大小切换另外一个文件
三个用途:
1.恢复:利用binlog日志恢复数据库数据
2.复制:主从同步
3.审计:经过二进制日志中的信息来进行审计,判断是否有对数据库进行注入攻击优化
三种模式:
1.statement 记录的是修改SQL语句
2.row 记录的是每行实际数据的变动,记两条,更新前和更新后
3.mixed statement和row模式的混合日志
1.先在引擎层写redolog,redolog处于prepare
2.而后在server写binlog
3.事务提交,redolog commit提交写入磁盘cdn
崩溃恢复 在1阶段完成后崩溃,回滚写入的redolog
在2阶段完成后崩溃,由于已经写入binlog因此不回滚server
事物隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(read-uncommitted) | 是 | 是 | 是 |
读已提交(read-committed) | 否 | 是 | 是 |
可重复读(repeatable-read) | 否 | 否 | 是 |
串行化(serializable) | 否 | 否 | 否 |
在一个事务中,读取了其余事务未提交的数据blog
在一个事务中,同一行记录被访问了两次却获得了不一样的结果索引
在一个事务中,同一个范围内的记录被读取时,其余事务向这个范围添加了新的记录。事务
前面脏读和不可重复读容易理解,幻读稍微难一点内存
假设图一test开始是空表,事物1第一次查询获得空表,事物2在事物1执行期间插入一条数据, 事物1第二次查询因为知足可重复读,因此查询结果依然为空,可是事物1插入一样一条数据,报重复主键错误
serialzable级别下能够避免以上三种状况
视图:视图能够理解为数据副本
不一样时刻开启的事务会建立不一样的视图,后续直接从视图读取数据,达到数据隔离,固然数据隔离还须要数据库锁的帮助。
同一数据库记录能够在系统中存在多个版本,这就是MVCC。
长事务意味着系统里面会存在很老的事务视图。因为这些事务随时可能访问数据库里面的 任何数据,因此这个事务提交以前,数据库里面它可能用到的回滚记录都必须保留,这就 会致使大量占用存储空间。因此须要避免长事务