加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-12 20:15:50 所属栏目:百科 来源:网络整理
导读:Atomic commit 原子提交的实现 1. 初始状态 2. 请求一个read lock Shared lock是加在OS buffer, 不是直接加在DISK上 3. 然后从disk读取data到OS Buffer,并存到User space中 4. 请求一个reversed lock 表示有更改数据库的意向, 真正的改动还 没有开始。 rev

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读