事务日志:使用事务日志,存储引擎在修改数据表的数据时只需要修改其内存拷贝,在把该修改记录持久到硬盘上的事务日志,而不是每次直接讲修改的数据本身持久到硬盘中
事务日志采用的时追加方式,因此写日志的操作是磁盘上一小块区域内的顺序I/O
事务日志持久后,内存中被修改的数据在后台可以慢慢刷回到磁盘 预写入式日志 修改数据需要写两次硬盘
1.脏读:一个事务读取了另一个事务未提交的数据
2.不可重复都:一个事务内,多次读取表中一行数据,结果不一致
3.虚读/幻读:一个事务内读取了另一个事务插入的数据,导致前后读取不一致。3级隔离级别 能保证事务可重复读,但是事务只锁定查询第一次运行时获取的数据资源(数据行),而不能锁定查询结果之外的行,就是原本不存在于数据表中的数据。因此在一个事务中当第一个查询和第二个查询过程之间,有其他事务执行插入操作且插入数据满足第一次查询读取过滤的条件时,那么在第二次查询的结果中就会存在这些新插入的数据,使两次查询结果不一致,这种读操作称之为幻读。)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。
事务隔离级别:(通过锁实现)
- Serializable(串行化):可避免脏读、不可重复读、虚读情况的发生。
强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
- Repeatable read(可重复读):可避免脏读、不可重复读情况的发生。
保证在一个事务中的两个读操作之间,其他的事务不能修改当前事务读取的数据,该级别事务获取数据前必须先获得共享锁同时获得的共享锁不立即释放一直保持共享锁至事务完成,所以此隔离级别查询完并提交事务很重要。保证一个事务中的两次查询到的结果一致,同时保证了丢失更新;例如酒店订房例子,两个人同时预定同一酒店的房间,,当事务1查询房间时事务就一直保持共享锁直到事务提交。
-
Read committed(读已提交):可避免脏读情况发生。
读操作之前首先申请并获得共享锁,允许其他读操作读取该锁定的数据,但是写操作必须等待锁释放,一般读操作读取完就会立刻释放共享锁。因为同一事务的其他实例在该实例处理期间可能会有新的commit,所以同一select可能返回不同结果。
-
Read uncommitted(读未提交):最低级别,以上情况均无法保证。允许其他事务读操作不申请锁直接读取,读操作不会影响写操作请求排他锁