2013-04-18 37 views
5

Trong ứng dụng Android của tôi, tôi phải chèn dữ liệu vào một số bảng SQLite từ các luồng khác nhau (một chuỗi để chèn vào một bảng và có 5 bảng). Có rất nhiều dữ liệu vì vậy tôi sử dụng beginTransaction() ->setTransactionSuccessful() ->endTransaction(); trong mỗi chủ đề và tất cả các chủ đề bắt đầu cùng một lúc, nhưng trong chủ đề thứ hai hoặc đôi khi ba tôi luôn luôn có ngoại lệ này:Không thể thực hiện thao tác vì không có giao dịch hiện tại khi chèn vào cơ sở dữ liệu

enter image description here

tôi sử dụng kết nối SQLite đơn (singleton) như là mentioned here nhưng vấn đề này vẫn còn. Vì vậy, tôi hy vọng cho một số help.Thanks trước!

P.S Và nếu tôi có điều kiện chủng tộc, tôi nên sử dụng cách nào khác để chèn đa luồng?

Trả lời

4

Tôi nghĩ rằng vấn đề của bạn là điều kiện chạy đua. Kể từ khi bạn có nhiều chủ đề được bắt đầu và kết thúc giao dịch, bạn có thể nhận được một cái gì đó giống như các hoạt động sau:

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() 

Tôi không nghĩ rằng Sqlite hỗ trợ nhiều giao dịch mở trên một kết nối duy nhất và khi bạn chỉ ra, nhiều kết nối là không thể.

Nếu mục tiêu của giao dịch là tăng tốc dữ liệu, thì bạn sẽ phải thay đổi kiến ​​trúc của mình và không viết nhiều chủ đề. Bạn có thể sử dụng một số loại lớp tiện ích để thực hiện các cập nhật cơ sở dữ liệu thực tế là synchronized để tất cả các chủ đề gọi vào và nó quyết định thời điểm mở hoặc đóng một giao dịch. Một ý tưởng khác là để có một chuỗi duy nhất làm các hoạt động cơ sở dữ liệu của bạn và tất cả các luồng khác ghi vào một BlockingQueue được chia sẻ với chuỗi ghi.

+0

Tôi đã thêm một số ý tưởng vào câu trả lời của mình @AlexanderKaraberov. – Gray

+0

Có một lớp (chỉ là một DAO) mà thay đổi cơ sở dữ liệu thực tế. Sau đó, chủ đề của bạn sẽ chỉ gọi là 'insert()' hoặc một số như vậy. Phương thức sẽ được 'đồng bộ hóa' và nó sẽ quyết định liệu tôi có cần bắt đầu giao dịch nếu nó chưa được bắt đầu hay kết thúc một giao dịch nếu nó đã được bắt đầu. – Gray

Các vấn đề liên quan