Гость
Форумы / SQLite [игнор отключен] [закрыт для гостей] / вопрос по синхронизации нескольких процессов / 3 сообщений из 3, страница 1 из 1
31.12.2013, 01:18
    #38516312
jytuiyjht7jgyf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по синхронизации нескольких процессов
Всем привет и с наступающим!

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

я написал такой код

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
SQLiteConnectionStringBuilder builder;

builder.DataSource = "database.db3";
builder.DefaultTimeout = Int32::MaxValue;
builder.Version = 3;

SQLiteConnection ObjConnection(builder.ConnectionString);
ObjConnection.Open();

SQLiteTransaction^ transaction = ObjConnection.BeginTransaction();


// тут я делаю все дела с базой данных

	
transaction->Commit();



сделал тест под двумя отладчиками два процесса запустил если один прошел через
BeginTransaction то второй процесс виснет на этом вызове пока первый не сделает Commit
или его не прибъют из диспетчера задач...

вопрос первый правильно ли я указал builder.DefaultTimeout = Int32::MaxValue ? так как без этого
вызова процесс который висит на BeginTransaction больше 30 секунд вылетает с исключением

SQLiteException -> 'The database file is locked database is locked'

задав builder.DefaultTimeout = Int32::MaxValue я добился того что ожидающий на вызове BeginTransaction
процесс будет ждать "вечно"

вопрос второй гарантирует ли такая схема что пока один процесс вызвал BeginTransaction и вошел в транзакцию
то никакие другие процессы в неё не войдут и повиснут все на вызове BeginTransaction пока первый процесс не вызовет
Commit Rollback или пока его не прибъют из диспетчера задач ?

спасибо
...
Рейтинг: 0 / 0
31.12.2013, 01:39
    #38516315
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по синхронизации нескольких процессов
jytuiyjht7jgyfвопрос первый правильно ли я указал builder.DefaultTimeout = Int32::MaxValue ? так как без этого
вызова процесс который висит на BeginTransaction больше 30 секунд вылетает с исключением

SQLiteException -> 'The database file is locked database is locked'

задав builder.DefaultTimeout = Int32::MaxValue я добился того что ожидающий на вызове BeginTransaction
процесс будет ждать "вечно"В общем, да.
Но с точки зрения простого пользователя, ошибка "занято, придите попозже" будет смотреться лучше чем бесконечное зависание.

jytuiyjht7jgyfвопрос второй гарантирует ли такая схема что пока один процесс вызвал BeginTransaction и вошел в транзакцию
то никакие другие процессы в неё не войдут и повиснут все на вызове BeginTransaction пока первый процесс не вызовет
Commit Rollback или пока его не прибъют из диспетчера задач ?Если твоя библиотека при вызове BeginThransation создает эксклюзивные транзакции то да.
Подробнее читай в: http://www.sqlite.org/lang_transaction.html
Но вообще, ты уверен что тебе обязательно надо блокировать? Обычно ручное начало транзакции не нужно - они стартуют автоматически при первой попытке писать в таблицу. И соответственно будут блокировать других писателей, не мешая читателям.
...
Рейтинг: 0 / 0
31.12.2013, 02:26
    #38516326
jytuiyjht7jgyf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос по синхронизации нескольких процессов
White OwlЕсли твоя библиотека при вызове BeginThransation создает эксклюзивные транзакции то да.
Подробнее читай в: http://www.sqlite.org/lang_transaction.html
Но вообще, ты уверен что тебе обязательно надо блокировать? Обычно ручное начало транзакции не нужно - они стартуют автоматически при первой попытке писать в таблицу. И соответственно будут блокировать других писателей, не мешая читателям.

без понятия создает ли она эксклюзивные транзакции и что это такое вообще весь код синхронизации я привел в первом посте а при работе с базой данных внутри транзакции используются только запросы SQL но раз второй процесс виснет на вызове BeginTransaction пока первый не сделает Commit то думаю все работает как надо

да мне нужно именно ручное начало транзакции и её конец так как нельзя даже читать пока другой процесс что то делает с базой
...
Рейтинг: 0 / 0
Форумы / SQLite [игнор отключен] [закрыт для гостей] / вопрос по синхронизации нескольких процессов / 3 сообщений из 3, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]