数据库事务的特点
- 原子性:一个事务中的所有操作作为不可分的最小原子,这里面的操作要么全部执行,要么全不执行
*原子性的实现原理:Undo Log *
在MySQL数据库InnoDB存储引擎中Undo Log 是实现多版本并发控制(简称:MVCC)
在操作任何数据之前,首先将数据备份到一个地方(这个存储备份的地方叫Undo Log).之后进行数据的修改。如果出现了错误或者用户执行了rollback语句,系统可以利用Undo Log中的备份将数据恢复到事务开始的地方
undo log是逻辑日志,可以理解为
- 当delete一条记录时,undo log 中会记录一条对应的insert记录
- 当insert一条记录时,undo log中会记录一条对应的delete记录
- 当update一条记录时,它会记录一条对应相反的update记录
- 持久性:
持久性实现原理: Redo Log
和Undo Log 相反,Redo Log 记录的是新数据的备份。在事务提交前,只需要将Redo Log 持久化即可,不需要将数据持久化。当系统崩溃时,虽然数据没有持久化,但是Redo Log 已经持久化。系统可以根据Redo Log 的内容,将数据恢复到最新的状态
- 隔离性:事务具有隔离性,理论来说事物之间的执行不应该产生影响,它们对数据库的影响应该和它们串行执行时一样
隔离性实现原理: 锁 for update 排它锁;; lock in share mode 共享锁
锁可以实现并发控制,但是还有其它的策略实现
- 基于时间戳的并发控制
- 基于有效性检查的并发控制
- 基于快照隔离的并发控制
SQL标准为事务定义了不同的隔离级别,从低到高- 读未提交
- 读已提交
- 可重复读(MySQL默认的)
- 串行化
- 一致性
一致性是事务的根本追求,一致性是靠原子性,隔离性,持久性来保障的