mysql事务

1、原子性实现原理:Undo log

- Undo log是为了实现事务的原子性,在mysql数据库InnoDB存储引擎中,
还用Undo log来实现多版本并发控制(MVCC)
- 在操作任何数据之前,首先将数据备份到一个地方(这个存储数据备份的地方称为Undo log).
然后进行数据修改。如果出现了错误或者用户执行了ROLLBACK语句,
系统可以利用undo log中的备份将数据恢复到事务之前的状态
- 注意:undo log是逻辑日志,可以理解为:
    - 当delete一条记录时,undo log中会记录一条对应的insert记录
    - 当insert一条记录时,undo log中会记录一条对应的delete记录
    - 当update一条记录时,undo log中会记录一条相反的update记录


(逻辑日志的意思是记录某一行数据的修改,物理日志是记录某一页的数据修改)

2、持久性原理: Redo log

- 和undo log相反,redo log记录的是新数据的备份。(异步写)
在事务提交前,只要将redo log持久化即可,不需要将数据持久化。
当系统崩溃时,虽然数据没有持久化,但是redo log已经持久化。
系统可以根据 redo log 的内容,将所有数据恢复到最新的状态
(innodb_flush_log_at_trx_commit)
WAL(write ahead log):预写日志

当我们每次执行update,insert,delete等语句后,commit操作后,redo log执行持久化操作

innodb_flush_log_at_trx_commit = 0/1/2

set global innodb_flush_log_at_trx_commit=2;
show variables like 'innodb_flush_log_at_trx_commit';

默认值为:1

由于实时将数据刷到磁盘中,在并发条件下,性能较低,

3、mysql的隔离级别

  • 读未提交(read_uncommitted):对事务处理的读取没有任何限制;
  • 读已提交(read_committed):
  • 可重复读(repeatable_read):默认级别
  • 串行化(seriauzable)
事务的隔离级别 脏读 不可重复读 幻读
读未提交(read_uncommitted)
读已提交(read_committed)
可重复读(repeatable_read)
串行化(seriauzable)

一致性

事务的并发执行,事务故障或系统故障 会对事务的一致性造成破坏

数据库系统通过并发控制技术和日志恢复技术来避免这种情况的发生:
- 并发控制技术保证了事务的隔离性(加锁),使数据库的一致性状态不会
因为并发执行的操作被破坏。
- 日志恢复技术保证了事务的原子性,是一致性状态下不会因事务或系统故障被破坏。
同时使已提交的对数据库的修改不会因为系统崩溃而丢失,保证了事务的持久性。