我知道回滚与手动清理不同,在大多数情况下是首选方法。也就是说,如果数据库中的其他表中存在并发保存和删除,那么大型数据库回滚与手动清理之间的性能差异是什么?
其他详情:
我目前正在开发一个Rails应用程序,允许用户导入大量嵌套学校数据。学校有很多老师,老师有很多教室,教室里有很多学生。因此,CSV可能类似于:
School 1
Teacher 1
Class 1
Student 1
Student 2
Student 5
Class 2
Student 3
Teacher 2
Class 4
Student 1
Student 4
在后台工作中,我正在使用此CSV,并且在数据库事务块中,在内存中构建一个巨大的学校对象,然后尝试单个保存。如果保存失败,由于验证原因或超时,事务块将回滚我的数据库到以前的状态。
我注意到这次回滚的性能在生产中非常缓慢。我相信部分原因是因为在回滚期间存在对数据库的并发读写。我现在正在考虑是否通过以下方式手动清理数据库会更快:dependent => :delete_all方法。当我在开发中对这些进行基准测试时,手动清理比回滚稍慢,但同样,没有并发读/写。