Если есть возможность для нескольких потоков выполнять вставку/обновление в базу данных SQLite, должен ли я всегда использовать блокировку?

У меня есть этот код, который использует блокировку:

            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;
                }
            }

и другой код, который не делает:

            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()
            });

Чтобы уменьшить вероятность проблем, должен ли я добавлять блокировку (l) ко всему коду, который обращается к базе данных?


person Alan2    schedule 28.11.2019    source источник
comment
Да, ты должен.   -  person Jason    schedule 28.11.2019


Ответы (1)


Вы должны предоставлять доступ к базе данных SQLite только одному потоку одновременно.

SQLite — это файловая база данных, поэтому доступ к файлу несколькими потоками (с использованием одного SQLiteConnection) приводит к непредсказуемому поведению и ошибкам повреждения.

Если вы используете библиотеку SQLite-Net-PCL для управления базой данных SQLite, вам следует посмотреть асинхронный API для одновременного доступа нескольких потоков к базе данных SQLite.

Дополнительную информацию о поддержке многопоточности базы данных SQLite см. в официальной документации и связанный вопрос

person picolino    schedule 31.01.2020