在多线程应用程序中以原子方式选择和修改

时间:2017-06-07 06:44:11

标签: android sqlite transactions

我正在开发一个Android应用程序,其中包含C中的大部分代码。我已经在C中编译了SQLite并使用它。

我有以下代码:

void func_foo(){

Select X from table1

Update X in table1

}

我希望func_foo以原子方式运行,并且从多个线程调用此函数。

我担心的是,一旦我从thread1运行select语句,thread2就不应该修改表之间的数据。

那么将整个数据库操作包装在事务中会使其成为原子吗?

或者我是否需要在函数上使用互斥锁,以便只有一个实例可以访问数据库?

3 个答案:

答案 0 :(得分:0)

我已经评论了几个堆栈答案和博客文章,说明了如何做到这一点:

1。 What are the best practices for SQLite on Android?

2。 http://touchlabblog.tumblr.com/post/24474750219/single-sqlite-connection

1号是最好的,2号是很多额外的工作而且是不必要的。 ContentProvider存在,因此您可以与其他应用共享数据。

答案 1 :(得分:0)

要使函数成为原子函数,必须将其包装在事务中。 (或者您必须确保调用它的代码使用事务.Android数据库框架具有递归事务;在C中,您必须自己实现它。)

此外,您必须确保多个线程不会最终使用相同的事务,因此您必须

  • 为每个线程提供自己的数据库连接,或
  • 使用某种锁(例如,互斥锁)来确保没有两个线程同时运行事务。

答案 2 :(得分:0)

问题的解决方案是立即交易或独占交易。默认情况下,Transaction是延迟事务,因此它们允许其他线程读取db,直到我们开始修改db。 以下链接解释了它。 http://www.sqlite.org/lang_transaction.html