redo 重做日志
作用:主要功能 保证 Durable(持久性)
记录内存数据页的变化
为了保证事物的持久性 保证commit 完成前会redo将内存的DML语句先写入磁盘 而数据是当内存达到百分75才开始写入磁盘
lsn:
当事物提交完成后 突然断电 然后重启数据库会对比LSN 发现redo log 和idb文件 如果不一致就会重新将数据写入磁盘
保证事物的durable
undo 回滚日志:
TXID:事物id号 commit之后 redo和undo会打标记提交了
作用:在acid 主要保证automic的特性 同时对consisdent isolate有一定的作用
记录修改之前的状态
当事物还没有提交的时候 进行rollback 操作 undo会判断事物id是否提交 去内存还原数据
还有一种情况 还没提交事物 redo顺带把日志写入磁盘 断电重启后先前滚 构造脏页 发现事物id没有提交 undo在回滚还原数据库
锁
“锁”顾名思义就是锁定的意思。
“锁”的作用是什么?
上一个事物没有提交 一般会锁表 就是不能并发
在事务ACID过程中
,“锁”和“隔离级别”一起来实现“I”隔离性和"C"一致性(redo也有参与)
悲观锁:行级锁定(行锁)谁先操作某个数据行
,就会持有<这行>的(X)锁.乐观锁:没有锁
隔离级别
transaction_isolation 隔离级别(参数)
transaction_isolation=read-uncommitted RU:读未提交,可脏读,一般部议叙出现
transaction_isolation=read-committed RC:读已提交,可能出现幻读,可以防止脏读
transaction_isolation= REPEATABLE-READ | RR:可重复读,功能是防止"幻读"现象,利用的是undo的快照技术+GAP(间隙锁)+NextLock(下键锁)
SR:可串行化,可以防止死锁,但是并发事务性能较差
什么叫做幻读?
在更新操作之前 commit了一个insert操作 出现了一些没有更新的数据
补充:在RC级别下,可以减轻GAP+NextLock锁的问题,但是会出现幻读现象,一般在为了读一致性会在正常select后添加forupdate语句.但是,请记住执行完一定要commit 否则容易出现所等待比较严重.
[world]>select*fromcitywhereid=999forupdate;
[world]>commit;
最高安全模式
innodb_flush_log_at_trx_commit=1
Innodb_flush_method=O_DIRECT
最高性能:
innodb_flush_log_at_trx_commit=0
Innodb_flush_method=fsync