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;

 

posted @ 2020-07-04 18:50  alenblue\own  阅读(428)  评论(0编辑  收藏  举报