Add*_*dev 1 sql sqlite android thread-safety
那是我的问题:
我有一个包含列的表:ID,VALUE和SYNCHRONICED.最后一个标志指示自上次更新以来是否已将一行发送到服务器.我有一些可以访问数据库的线程运行
我的问题来自用例(有2个线程T1和T2:
T1-->Start_Send-->Query_Values-->Send_to_server-->wait_answer-->sync=1_for_sent_rows
T2------------------------->Update_a_row_sent
Run Code Online (Sandbox Code Playgroud)
此时,T1已用sync = 1标记由T2更新的值.
有没有办法避免这个问题?
谢谢
小智 8
既然你问过如何在android上锁定数据库/表,你可以使用SQLiteDatabase.beginTransaction()来实现:
来自android docs http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html:
public void beginTransaction()
自:API级别1
在EXCLUSIVE模式下开始交易.
并从sqlite 3 http://www.sqlite.org/lang_transaction.html
在BEGIN EXCLUSIVE之后,除了read_uncommitted连接之外,没有其他数据库连接能够读取数据库,没有异常的其他连接将无法写入数据库,直到事务完成.
beginTransaction启动一个事务并将您的数据库置于独占锁中,因此当T1 select运行时,它阻止T2更新行,直到T1调用db.endTransaction().
public yourMethod() {
db.beginTransaction();
//do whatever you want with db;
db.setTransactionSuccessful();
db.endTransaction();
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4384 次 |
最近记录: |