同时写文件和数据库,如何保证数据一致性?

2019-06-25 21:02:29 +08:00
 maxxfire
有一个事务需要做 2 件事:在文件系统中存储一个文件,同时在数据库生成一条记录。
两者没有先后顺序的要求,但是要满足要么都成功,要么都失败。
怎么才能做到这样,满足一致性(比如在突然断电情况下,也不影响结果),或者有什么措施能够尽量使数据可靠?
6756 次点击
所在节点    程序员
37 条回复
janxin
2019-06-26 11:38:37 +08:00
同时写缓存和数据库,怎么保证一致性?
jaskle
2019-06-26 12:43:11 +08:00
事务回滚,写完文件再提交,写文件用写完后移动改名的方法,瞬间完成,若是失败回滚即可。但是要注意,频繁断电无法保证,甚至提交到数据库的内容都可能会丢失,经历过。
linyinma
2019-06-26 12:46:27 +08:00
Pos 机冲正概念应该你能用到: ( 1 )写冲正文件;( 2 )做些事情( A、B、C...);( 3 )删除冲正文件;

( 1 )做事情前修需要检测冲正文件,文件存在就要回滚(防止上一次掉电等原因事务未做完);
( 2 )事务完整就删冲正文件;
BBCCBB
2019-06-26 13:21:18 +08:00
用 2pc, tcc 这种思路。
petelin
2019-06-26 13:46:58 +08:00
Wal 日志
tabris17
2019-06-26 13:48:09 +08:00
预写日志,失败回滚
Mirana
2019-06-26 13:53:30 +08:00
写数据库失败了 需要删除文件?
Mitt
2019-06-26 13:54:21 +08:00
@wweir 你哪句话里看到说要强一致性了
prasanta
2019-06-26 14:03:29 +08:00
只能保证最终一致性,看你们的不一致时间窗口容忍度
IsaacYoung
2019-06-26 14:16:23 +08:00
single source of truth
anyuhanfei
2019-06-26 17:18:07 +08:00
这难道不是类似上传图片的基本操作?在逻辑层做判断呗
MeteorCat
2019-06-26 17:25:39 +08:00
文件一致性用文件的 hash 值就行了
DonaldY
2019-06-26 17:37:50 +08:00
话说计算文件 md5,不得把文件读取到服务器本地嘛,或者分块计算?
DonaldY
2019-06-26 17:38:33 +08:00
歪楼。

话说计算文件 md5,不得把文件读取到服务器本地嘛,或者分块计算?

请教下,大家一般怎么处理的?
husinhu
2019-06-26 20:01:47 +08:00
两个操作对应两个 fsync() 所以本质上要把这两个操作一起 commit。即便是 TxF 也不能保证能一起 rollback。要是我做就简单的 db as log,加一个 column 叫 filetxid,每次写完就写一行就 append 文件以 filetxid 作为前缀写完 fsync()落物理存储。每次恢复以 db 为准,如果文件末尾损坏做 replay。
husinhu
2019-06-26 20:04:25 +08:00
楼主是要存储文件不是写文件,我看错了嘿嘿,不过方法类似,db as wal log
troywinter
2019-06-27 20:52:29 +08:00
TCC,最终一致性,2pc 对业务不透明而且实现难度大,https://queue.acm.org/detail.cfm?id=1394128 参考 BASE 模型

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/577418

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX