|
вопрос по синхронизации нескольких процессов
|
|||
---|---|---|---|
#18+
Всем привет и с наступающим! ситуация такая есть два процесса на одной машине работающие с одним файлом базы данных мне нужно чтобы второй процесс блокировался пока первый не завершит все дела с базой данных я написал такой код Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
сделал тест под двумя отладчиками два процесса запустил если один прошел через 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 или пока его не прибъют из диспетчера задач ? спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
31.12.2013, 01:18 |
|
вопрос по синхронизации нескольких процессов
|
|||
---|---|---|---|
#18+
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 Но вообще, ты уверен что тебе обязательно надо блокировать? Обычно ручное начало транзакции не нужно - они стартуют автоматически при первой попытке писать в таблицу. И соответственно будут блокировать других писателей, не мешая читателям. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.12.2013, 01:39 |
|
вопрос по синхронизации нескольких процессов
|
|||
---|---|---|---|
#18+
White OwlЕсли твоя библиотека при вызове BeginThransation создает эксклюзивные транзакции то да. Подробнее читай в: http://www.sqlite.org/lang_transaction.html Но вообще, ты уверен что тебе обязательно надо блокировать? Обычно ручное начало транзакции не нужно - они стартуют автоматически при первой попытке писать в таблицу. И соответственно будут блокировать других писателей, не мешая читателям. без понятия создает ли она эксклюзивные транзакции и что это такое вообще весь код синхронизации я привел в первом посте а при работе с базой данных внутри транзакции используются только запросы SQL но раз второй процесс виснет на вызове BeginTransaction пока первый не сделает Commit то думаю все работает как надо да мне нужно именно ручное начало транзакции и её конец так как нельзя даже читать пока другой процесс что то делает с базой ... |
|||
:
Нравится:
Не нравится:
|
|||
31.12.2013, 02:26 |
|
|
start [/forum/topic.php?fid=54&msg=38516326&tid=2008836]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
50ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 149ms |
0 / 0 |