在sqlite中锁定数据库或表(Android)

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更新的值.

有没有办法避免这个问题?

  • 查询和更新的方法不同,因此无法在方法中使用synchronized.
  • 如果T2在T1结束之前被阻止,则没有问题

谢谢

小智 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)