Как сделать правильное взаимодействие с базой данных SqLite в многопотоке

anarbus

Client
Регистрация
16.07.2019
Сообщения
317
Благодарностей
15
Баллы
18
Может у кого то есть примеры реализации, данной задачи?
Что бы данные записывались в многопотоке?
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 606
Благодарностей
4 597
Баллы
113
при строгой записи проблем возникать не должно при использовании стандартных методов зенно
 

anarbus

Client
Регистрация
16.07.2019
Сообщения
317
Благодарностей
15
Баллы
18
при строгой записи проблем возникать не должно при использовании стандартных методов зенно
Под строгой записью вы имеете ввиду указание столбца, строки и т.д?
А если в двух потоках эти данные совпадут?
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 606
Благодарностей
4 597
Баллы
113
под строгой записью я подразумеваю, что не будет ситуаций, когда на чтение нужно будет брать уникальные строки и взявший строку поток не успеет изменить её, чтобы другой поток не смог взять. Т.е. работа идёт только на запись данных

А если в двух потоках эти данные совпадут?
Ты собрался писать данные, указывая номер строки? Я тут не совсем понял, как ты собрался вести запись и каких потенциальных проблем ты боишься
 
  • Спасибо
Реакции: anarbus

artomka

Client
Регистрация
23.08.2018
Сообщения
159
Благодарностей
93
Баллы
28
При записи в 100 потоков проблем нет, а вот при взятии уникальныъ данных начинаются костыли.

sqlite не умеет лочить строки поэтому приходится лочить всю таблицу либо глобальным локом:


C#:
lock(SyncObject) {
    System.Threading.Thread.Sleep(500);
string db_answer = ZennoPoster.Db.ExecuteQuery("SELECT ID,acc_name FROM accs WHERE Is_Busy = 0 AND status = 'GOOD' AND DATETIME(NEXT_RUN_TIME) <= DATETIME('now') LIMIT 1", null, ZennoLab.InterfacesLibrary.Enums.Db.DbProvider.Odbc, @"Driver={SQLite3 ODBC Driver};database=" + project.Directory + @"\data\main_db.db", ";", ";");
var result_id = Macros.TextProcessing.Split(db_answer, ";", "0").First();
string ingnore = ZennoPoster.Db.ExecuteNonQuery("UPDATE accs SET Is_Busy = 1 WHERE ID = " + result_id + ";", null, ZennoLab.InterfacesLibrary.Enums.Db.DbProvider.Odbc, @"Driver={SQLite3 ODBC Driver};database=" + project.Directory + @"\data\main_db.db").ToString();
}
Либо лочить своими локами чтоб не было фризов в других потоках пока они работают с другими данными:
C#:
lock(CommonCode.Accs1Locker) {
}
Под строгой записью вы имеете ввиду указание столбца, строки и т.д?
А если в двух потоках эти данные совпадут?
Вы когда дб создаете можете указать какие данные должны быть уникальными, и повторы не попадут в дб, будет выбивать ошибку.

Либо можете проверять есть ли уже подобные данные в дб перед тем как добовлять сами, используя локи либо как вам вздумается.
 
Последнее редактирование:
  • Спасибо
Реакции: anarbus

anarbus

Client
Регистрация
16.07.2019
Сообщения
317
Благодарностей
15
Баллы
18
под строгой записью я подразумеваю, что не будет ситуаций, когда на чтение нужно будет брать уникальные строки и взявший строку поток не успеет изменить её, чтобы другой поток не смог взять. Т.е. работа идёт только на запись данных


Ты собрался писать данные, указывая номер строки? Я тут не совсем понял, как ты собрался вести запись и каких потенциальных проблем ты боишься
Я только познакомился с SqlLite и могу ошибаться, мои познания с записью и чтением данных, заканчиваются на txt и Excel) Если что, сорян

Вот каких проблем я опасаюсь:
1)
100 потоков будут добавлять новую запись, например:
id|Country | City
1| USA | NewYork
2| Russia | Moscow
и т.д
Если добавление подобных данных будут происходить одновременно у всех 100 потоков, не перезапишется ли часть данных в 1 строку? Или в SQLite такое не может произойти? id - у меня PRIMARY KEY AUTOINCREMENT
Добавление осуществляю при помощи такой команды
Код:
INSERT INTO CountryAndCitysTable (Country, City)
VALUES ('Russia, 'Moscow');
2)
Если в 100 ячейках будет одновременно обновляться информация посредством такого кода:

Код:
UPDATE CountryAndCitysTable
SET City = 'Saint Petsburg'
WHERE Country = Russia;
Будет ли записана верная информация в каждую ячейку?
Или часть изменений сохраниться, а часть нет?
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 606
Благодарностей
4 597
Баллы
113
Я только познакомился с SqlLite и могу ошибаться, мои познания с записью и чтением данных, заканчиваются на txt и Excel) Если что, сорян

Вот каких проблем я опасаюсь:
1)
100 потоков будут добавлять новую запись, например:
id|Country | City
1| USA | NewYork
2| Russia | Moscow
и т.д
Если добавление подобных данных будут происходить одновременно у всех 100 потоков, не перезапишется ли часть данных в 1 строку? Или в SQLite такое не может произойти? id - у меня PRIMARY KEY AUTOINCREMENT
Добавление осуществляю при помощи такой команды
Код:
INSERT INTO CountryAndCitysTable (Country, City)
VALUES ('Russia, 'Moscow');
2)
Если в 100 ячейках будет одновременно обновляться информация посредством такого кода:

Код:
UPDATE CountryAndCitysTable
SET City = 'Saint Petsburg'
WHERE Country = Russia;
Будет ли записана верная информация в каждую ячейку?
Или часть изменений сохраниться, а часть нет?
1. Добавление будет всегда в новую строку
2. Изменения затронут все строки, удовлетворяющие условию на момент запроса
 
  • Спасибо
Реакции: anarbus

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)