事务的基本特性:ACID
- A:原子性
- 理解:事务是一种紧密相连的逻辑单元,一起成功一起失败
- 实现:回滚日志——所有事务进行的修改都会先记录到回滚日志中,然后在对数据库的中的数据进行写入。回滚日志是为了在发生错误或者用户rollback或者系统发生崩溃或者数据库进程被杀死后,当用户再次启动数据库进程时能通过查询回滚日志讲之前未完成的事务回滚。这就是回滚日志先于数据持久化到磁盘的原因。
- 并行事务的原子性:transaction2依赖于transaction1,当transaction1执行时出现问题需要回滚时,为了保证事务的原子性,也需要讲transaction2也回滚,这种情况叫做级联回滚。当并行事务越多时,事务的依赖关系就越复杂,这回导致大量的工作需要撤回,这是我们不愿见到的。
- C:持久性
- 理解:1.一旦事务被提交,数据就一定会写入数据库并永久保存起来;2.当事务一旦被提交后,就不能回滚,只能通过创建相反的事务对原操作进行补偿。
- 实现:重做日志——当我们在一个事务中尝试对数据进行修改时,它会先将数据从磁盘读入内存,并更新内存中缓存的数据,然后生成一条重做日志并写入重做日志缓存,当事务真正提交时,MySQL 会将重做日志缓存中的内容刷新到重做日志文件,再将内存中的数据更新到磁盘上,图中的第 4、5 步就是在事务提交时执行的。
- 事务日志:数据库事务的原子性和持久性就是有事务日志保证的,具体的实现就是回滚日志(保证需要回滚的事务成功回滚)和重做日志(事务提交后,数据还没写入磁盘就宕机时,下次重新启动时能够恢复数据);
一条事务日志同时包括修改前后的值,能够很容易的进行回滚和重做。
- I:隔离性