事务有4种特性(ACID):原子性、一致性、隔离性和持久性
在事务中的操作,要么全部执行,要么全部不做,这就是事务的目的
事务的隔离性由锁机制实现,原子性、一致性和持久性由事务的redo 日志和undo 日志来保证
Redo日志
由来
要保证持久性,一个简单粗暴的方法就是在事务提交完成之前把该事务所修改的所有页面都刷新到磁盘。但这样做太浪费了,若只是更新了一个字节的数据,就要刷新完整的一个数据页,显然太浪费了
我们只是想让已经提交了的事务对数据库中数据所做的修改永久生效,即使后来系统崩溃,在重启后也能把这种修改恢复出来。因此我们只需要记录一下修改了哪些东西即可
这样我们在事务提交时,把上述内容刷新到磁盘中,即使之后系统崩溃了,重启之后只要按照上述内容所记录的步骤重新更新一下数据页,那么该事务对数据库中所做的修改又可以被恢复出来,也就意味着满足持久性的要求
分类
- 内存中重做日志缓冲 (redo log buffer),是易失的,在内存中
- 重做日志文件 (redo log file),是持久的,保存在磁盘中
主要作用
用于数据库的崩溃恢复
Undo日志
由来
事务的首要特性就是原子性 —— 事务中的操作要么全部完成,要么什么也不做。但天公总是不作美,执行到一半时总会有各种突发情况,如
- 情况一:事务执行过程中可能遇到各种错误,比如服务器本身的错误,操作系统错误,甚至是突然断电导致的错误
- 情况二:程序员可以在事务执行过程中手动输入ROLLBACK语句结束当前的事务的执行
这两种情况都会导致事务执行到一般就结束,但是事务执行过程中已经修改了很多东西,为了保证原子性,我们需要恢复原样
主要作用
- 回滚
- MVCC(感兴趣的可以点我了解)
#该文章暂时没有评论