SQLite学习(七) - 如何实现原子提交

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步骤。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值