2013-04-18 14 views
5

W mojej aplikacji Android muszę wstawić dane do kilku tabel SQLite z różnych wątków (jeden wątek do wstawienia do jednej tabeli i jest 5 tabel). Istnieje wiele danych więc używam beginTransaction() ->setTransactionSuccessful() ->endTransaction(); w każdym wątku i wszystkich wątków startują jednocześnie, ale w drugim lub czasami trzeciego wątku ja zawsze mam ten wyjątek:Nie można wykonać operacji, ponieważ nie ma bieżącej transakcji podczas wstawiania do bazy danych

enter image description here

używam jedno połączenie SQLite (singleton), jak było mentioned here, ale jednak ten problem pozostaje. Tak, mam nadzieję na jakąś pomoc. Dziękuję z góry!

P.S A jeśli mam warunki wyścigowe, w jaki inny sposób powinienem użyć do wstawiania wielowątkowego?

Odpowiedz

4

Myślę, że twój problem to stan wyścigu. Skoro masz wiele wątków, które są rozpoczęcia i zakończenia transakcji, można uzyskać coś jak następujących operacji:

beginTransaction() 
// this may be a noop because a transaction is already open 
beginTransaction() 
setTransactionSuccessful() 
setTransactionSuccessful() 
endTransaction() 
// this may throw because the previous end closes the transaction 
endTransaction() 

I nie sądzę, że SQLite obsługuje wiele otwartych transakcji na jednego połączenia i jak zwrócić uwagę, wiele połączeń nie jest możliwe.

Jeśli celem transakcji jest przyspieszenie danych, będziesz musiał zmienić architekturę i nie pisać z wielu wątków. Możesz użyć jakiejś klasy narzędziowej, aby wykonać aktualne aktualizacje bazy danych, czyli synchronized, aby wszystkie wątki wywoływały i decydowały, kiedy otworzyć lub zamknąć transakcję. Innym pomysłem byłoby posiadanie pojedynczego wątku do operacji na bazie danych i wszystkich innych wątków zapisywania w pliku BlockingQueue, który jest współdzielony z wątkiem pisania.

+0

Dodałem kilka pomysłów do mojej odpowiedzi @AlexanderKaraberov. – Gray

+0

Mieć klasę (tylko DAO), która zmienia rzeczywistą bazę danych. Wtedy twoje wątki po prostu wywołają 'insert()' lub niektóre takie. Metoda byłaby "zsynchronizowana" i zdecydowałaby, czy muszę rozpocząć transakcję, jeśli jeszcze nie została rozpoczęta, lub zakończyć transakcję, jeśli była już uruchomiona. – Gray

Powiązane problemy