事务特性和实现原理
# 事务特性与实现原理
## 事务特性
>i 原子性(Atomicity)
事务中的所有操作作为一个整体像原子一样不可分割,要么全部成功,要么全部失败。
>i 一致性(Consistency)
事务的执行结果必须使数据库从一个一致性状态到另一个一致性状态。一致性状态是指:1.系统的状态满足数据的完整性约束(主码,参照完整性,check约束等) 2.系统的状态反应数据库本应描述的现实世界的真实状态,比如转账前后两个账户的金额总和应该保持不变。
>i 隔离性(Isolation)
并发执行的事务不会相互影响,其对数据库的影响和它们串行执行时一样。比如多个用户同时往一个账户转账,最后账户的结果应该和他们按先后次序转账的结果一样。
>i 持久性(Durability)
事务一旦提交,其对数据库的更新就是持久的。任何事务或系统故障都不会导致数据丢失。
在事务的ACID特性中,C即一致性是事务的根本追求,而对数据一致性的破坏主要来自两个方面
1.事务的并发执行
2.事务故障或系统故障
## 事务实现原理
<img src="https://oscimg.oschina.net/oscnet/up-7b54f7847cee22930ec53a4058179a2b531.png" width=460 height=300>
- 并发控制技术保证了事务的隔离性,使数据库的一致性状态不会因为并发执行的操作被破坏。
- 日志恢复技术保证了事务的原子性,使一致性状态不会因事务或系统故障被破坏。同时使已提交的对数据库的修改不会因系统崩溃而丢失,保证了事务的持久性。
### 回滚日志(undo)
undo log属于 「 逻辑日志 」,它记录的是sql执行相关的信息。当发生回滚时,InnoDB会根据undo log的内容做与之前相反的工作:对于每个insert,回滚时会执行delete;对于每个delete,回滚时会执行insert;对于每个update,回滚时会执行一个相反的update,把数据改回去。
undo log用于存放数据被修改前的值,如果修改出现异常,可以使用undo日志来实现回滚操作,保证事务的一致性。另外InnoDB MVCC事务特性也是基于undo日志实现的。
因此,undo log有两个作用:提供回滚和多个行版本控制(MVCC)。
### 重做日志(redo)
redo log重做日志记录的是新数据的备份,属于物理日志。在事务提交前,只要将redo log持久化即可,不需要将数据持久化。当系统崩溃时,虽然数据没有持久化,但是redo log已经持久化。系统可以根据redo log的内容,将所有数据恢复到最新的状态。
redo log包括两部分:一是内存中的日志缓冲(redo log buffer),该部分日志是易失性的;二是磁盘上的重做日志文件(redo log file),该部分日志是持久的。
MySQL中redo log刷新规则采用一种称为Checkpoint的机制(利用LSN实现),为了确保安全性,又引入double write机制。
## 事务基本操作
开启事务:start transaction
回滚事务:rollback
提交事务:commit
## 参考资料
[1、详细分析MySQL事务日志(redo log和undo log)](https://www.cnblogs.com/f-ck-need-u/archive/2018/05/08/9010872.html)
[2、数据库事务的概念及其实现原理](https://www.cnblogs.com/takumicx/p/9998844.html)
[3、数据库事务实现原理](https://zhuanlan.zhihu.com/p/281927963)