В моем приложении я вызываю некоторые веб-службы для обновления базы данных. Каждый вызов webservice выполняется в определенном потоке, в результате чего несколько потоков обновляют объект базы данных «за раз».Операции SQLite SQLite и несколько потоков
В каждом потоке, я использую транзакции так:
Thread 1 (webservice 1)
beginTransaction()
insert a row in the table 1
update a row in the table 1
endTransaction()
Thread 2 (webservice 2)
beginTransaction()
update a row in the table 2
update a row in the table 2
endTransaction()
Но я борюсь с одним вопросом я не могу ответить себе после того, как его прибегая к помощи; Как транзакции обрабатываются в разных потоках, отличаются ли они друг от друга? Другими словами, использует ли БД отдельный «стек операторов» или общий?
Из моих показаний, я понимаю сделки в одном стеке, то есть совершали сделки в потоке 1 может совершать обновления на таблице 2. Например, DB стек заявление, как я думаю, что это может произойти:
beginTransaction() //Thread 1 begins a transaction
insert a row in the table 1
update a row in the table 1
beginTransaction() //Thread 2 begins a transaction
update a row in the table 2
update a row in the table 2
endTransaction() //Thread 2 ends a transaction
endTransaction() //Thread 1 ends a transaction
Если это правда, как я могу сделать свои транзакции действительно эксклюзивами? У меня есть BEGIN EXCLUSIVE TRANSACTION
и обрабатывать ошибку SQLITE_BUSY
всюду или что-то еще проще?
Одна идея состоит в том, чтобы использовать Singleton шаблон в вашем DBHandler или класса DBadapter. И синхронизировать инструкции вставки – drulabs