问题描述
我有一个复杂的对象图,我将其保存到数据库中。这些对象都可以连接到类似类型的其他图形。我希望保存对象图以及它们递归连接的所有图。
汇总所有保存并在一个事务下执行它们是不好的做法吗?每个图形应该单独保存吗?
目前我分别保存每个子图。下面是示例代码(.NET)
public async Task<GraphObj> SaveAllGraphs(GraphObj graph)
{
foreach (var node in graph.nodes)
{
if (node.subGraph != null)
{
await SaveGraph(node.subGraph);
}
}
return await SaveGraphInstance(graph);
}
async public Task SaveGraphInstance(GraphObj graph)
{
var txClient = (ITransactionalGraphClient)_client;
await txClient.ConnectAsync();
using (var tx = txClient.BeginTransaction())
{
await _client.Cypher.Create(...).ExecuteWithoutResultsAsync();
await _client.Cypher.Create(...).ExecuteWithoutResultsAsync();
await tx.CommitAsync();
}
}
}
解决方法
没有真正的答案,因为这取决于您的用例。
如果你的子图等都应该在那里,或者根本不存在,那么你应该在一个事务中完成所有这些。这与其他任何东西都没有什么不同 - 数据库或实际上是应用程序。事务的好处是,它的任何一个部分失败,它都失败了。
就性能而言,这两种方法之间没有真正的区别,都对数据库进行 n 次调用。