C# 如果可能有多个线程在SQLite数据库中执行插入/更新,我应该始终使用lock吗?

C# 如果可能有多个线程在SQLite数据库中执行插入/更新,我应该始终使用lock吗?,c#,sqlite,xamarin,xamarin.forms,sqlite-net,C#,Sqlite,Xamarin,Xamarin.forms,Sqlite Net,我有一个使用锁的代码: lock (l) { db2.BeginTransaction(); try { rc1 = db2.Execute(s); db2.Commit(); } catch (Exceptio

我有一个使用锁的代码:

            lock (l)
            {
                db2.BeginTransaction();
                try
                {
                    rc1 = db2.Execute(s);
                    db2.Commit();
                }
                catch (Exception ex)
                {
                    db2.Rollback();
                    Crashes.TrackError(ex,
                        new Dictionary<string, string> {
                            {"RunExecute", "Exception"},
                            {"sql", s },
                            {"Device Model", DeviceInfo.Model },
                        });
                    throw;
                }
            }

为了减少出现问题的可能性,我是否应该在访问数据库的所有代码周围添加锁(l)?

您必须一次只提供一个线程访问SQLite数据库。

SQLite是一个基于文件的数据库,因此访问文件的多个线程(使用一个
SQLiteConnection
)会导致不可预测的行为和损坏错误

若您使用库来操作SQLite数据库,那个么您应该查看多个线程对SQLite数据库的并发访问


有关SQLite数据库多线程支持的更多信息,请参阅和

您必须一次只提供一个线程访问SQLite数据库。

SQLite是一个基于文件的数据库,因此访问文件的多个线程(使用一个
SQLiteConnection
)会导致不可预测的行为和损坏错误

若您使用库来操作SQLite数据库,那个么您应该查看多个线程对SQLite数据库的并发访问


有关SQLite数据库多线程支持的更多信息,请参阅和

是的,您应该。是的,您应该。
            db2.Insert(new QuizHistory()
            {
                QuizId = quiz,
                Cards  = (App.viewablePhrases ?? GetViewablePhrases(MO.Quiz)).Count,
                Score = score,
                UtcNow = (int)Math.Truncate(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalSeconds),
                Viewed = 1,
                Deck   = Helpers.Deck.GetTitle()
            });