Atomic commit
原子提交的实现
1. 初始状态
2. 请求一个read lock
Shared lock是加在OS buffer, 不是直接加在DISK上
3. 然后从disk读取data到OS Buffer, 并存到User space中
4. 请求一个reversed lock
表示有更改数据库的意向, 真正的改动还 没有开始。
reversed lock可以和多个shared lock共存,但是一个时间只能有一个reversed lock。即一个时间只能有一个进程或事物可以写数据库。
5. 创建一个rollback journal文件
将old数据写入rollback journal文件,还有更改之前的数据库大小。rollback journal包含rollback所需的所有信息。
rollback journal文件不是马上写到DISK,而是存在OSbuffer,当OS IO空闲时写入disk。
6. 在user space更改data
7. 将rollback journal文件写到磁盘
这是很重要的一步, 保证断电或db crash时,数据库可恢复。 写rollback journal文件到磁盘要分两步fsync(),一将base rollback journal文件写到DISK,二将rollback journal header写到DISK
8. 请求一个exclusive lock
也是在OS buffer。 请求exclusive lock要分两步,一先请求一个pending lock, pending lock可以与shared lock共存,但是其他进程或事物不能再获取新的shared lock, 当所有的shared lock被释放时, pendling lock就变成exclusive lock。
9. 将改动写到OS buffer
10. 将改动从OS buffer写到DISK
11. 删除rollback journal文件
当transaction commit时,删除rollback jounal文件。如果删除成功,数据库视改动成功,如果没有删除,表示事物失败,将rollback到改动前状态。
由于删除文件is expensive, 一般用truncate system call to truncate the file to zero byte or overwrite the file header to zero.
12. 释放exclusive lock
transaction到这里结束。下面将介绍Rollback步骤。