我正在开发一个Android应用程序,其中包含C中的大部分代码。我已经在C中编译了SQLite并使用它。
我有以下代码:
void func_foo(){
Select X from table1
Update X in table1
}
我希望func_foo
以原子方式运行,并且从多个线程调用此函数。
我担心的是,一旦我从thread1运行select语句,thread2就不应该修改表之间的数据。
那么将整个数据库操作包装在事务中会使其成为原子吗?
或者我是否需要在函数上使用互斥锁,以便只有一个实例可以访问数据库?
答案 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