【问题标题】:Does a db.RunInTransaction always require a way to check or handle a rollback?db.RunInTransaction 是否总是需要一种方法来检查或处理回滚?
【发布时间】:2017-04-21 21:59:36
【问题描述】:
我接手的应用有这个代码:
db.RunInTransaction(() =>
{
foreach (CategorySource category in categories)
{
db.Insert(category);
}
Console.Out.WriteLine("Categories: \r\n {0}", categories.Count);
}); db.Commit();
如果无法处理或检查是否有回滚,谁能告诉我在事务中运行它有什么好处?
【问题讨论】:
标签:
sqlite
xamarin
xamarin.forms
【解决方案1】:
对于您向我们展示的示例,即执行一次插入,如果不可能捕获异常和回滚,我认为在事务中执行此操作没有任何好处。然而,更可能的意图是提供一种简单的方法来执行多个 SQL 命令,例如多个插入,在单个事务中。如果您的代码希望从数据库的其他观察者的角度来看这些插入是原子的,那么在那里使用事务将是一个重点。即使没有机会回滚也是如此,前提是您有理由确定/不担心失败可能不会发生。
从sqlite-net documentation,有一种方法可以进行回滚,但您需要使用低级 API,例如
db.BeginTransaction ();
try {
foreach (CategorySource category in categories)
{
db.Insert(category);
}
Console.Out.WriteLine("Categories: \r\n {0}", categories.Count);
db.Commit ();
}
catch (Exception) {
db.Rollback ();
throw;
}