我在Sequel gem中使用Que,我对编写需要处理大量数据的作业是否安全感兴趣,太多的数据比可以安全地放置在一个数据库事务中的数据多,例如定期导入/导出80k+行(我目前以1k记录事务批处理记录)。
我担心的是,如果gem/postgres在后台工作执行中做了某种隐式事务,这可能会使回滚段失控,并使DB崩溃。
我问这个的原因是,来自文档的这一行:
安全性——如果一个Ruby进程死亡,它正在处理的作业不会丢失,也不会处于锁定或模糊状态——它们会立即被其他进程获取。
对我来说,这是"嵌套在事务中",如果我的担心是真的,这可能会导致将80k记录静默地包装到相同的回滚段中。我可以在我的笔记本电脑上尝试一下,但是我的笔记本电脑比生产虚拟机强大得多,所以我担心它可能会在我的开发环境中成功地崩溃,然后在部署中崩溃。
有类似Que经验的人可以帮忙吗?
链接:同样的问题在GH
开发者回答:
在每个作业周围没有隐式事务-通过使用建议锁锁定作业id来保证。如果客户端连接丢失,无论事务状态如何,Postgres都会为我们释放咨询锁。