innoDB存储引擎如何保证事务的ACID
innodb事务的ACID:
隔离性, 原子性, 一致性,持久性
1, 锁实现隔离性
2, redo log保证事务的原子性和持久性
3, undo log 保证事物的一致性
force log at commit
innodb_flush_log_at_trx_commit: 控制redo log buffer刷新到磁盘的策略
=0 表示事务提交时不进行写入redo log操作,这个操作只在master thread完成,而在master thread中每1秒进行一次redo log文件的fsync操作
=1 (默认值) 事务提交时,必须调用一次fsync操作
=2 事务提交时,redo log buffer会写入到操作系统缓存中,但是不进行fsync操作
二、事务的并发问题
1、脏读:事务A读取了会话B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
2、不可重复读:会话 A 两次查询数据,查询记录数是一样的,但是记录本身不一样,会话 B再两次查询中间执行了update并提交了。
3、幻读:会话 A 两次查询数据,查询记录数不一样,会话 B在会话A两次查询中间执行了insert,delete并提交了。
小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表
三,MySQL事务隔离级别
事务隔离级别 | 脏读 | 不可重复读 | 幻读 |
读未提交(read-uncommitted) | 是 | 是 | 是 |
读已提交(read-committed) | 否 | 是 | 是 |
可重复读(repeatable-read) | 否 | 否 | 是 |
串行化(serializable) | 否 | 否 | 否 |
# 设置事务隔离级别
set session transaction isolation level read committed;
# 查看事务隔离级别
# v5.7及以前
select @@tx_isolation;
# v8.0及以后
select @@transaction_isolation;