使用 greendao 的 SQLite 事务行为
SQLite transaction behaviour using greendao
我在我的 Android 项目中使用 greendao 作为 ORM 库,但在理解事务行为时遇到问题。
greendao 提供了一个 API runInTx(Runnable r)
。
我的问题是,将如何处理来自不同线程的此方法的两次调用?
线程 1
public void thread1() {
DaoManager.INSTANCE.getDaoSession().runInTx(new Runnable()
{
doQueries();
doInsertsAndUpdates();
}
}
线程 2
public void thread2() {
DaoManager.INSTANCE.getDaoSession().runInTx(new Runnable()
{
doQueries();
doInsertsAndUpdates();
}
}
我看到,runInTx
正在以独占模式调用 SQLiteDatabase.beginTransaction
,因此当此事务打开时,没有其他线程可以 read/write 访问数据库。
但我无法弄清楚的是,当线程 1 正在做他的工作(即 doQueries
)时,另一个线程(即线程 2)是否会被阻塞,所以 doQueries
和 doInsertsAndUpdates
在线程 1 完成事务之前,线程 2 不会执行?
感谢您的帮助。
SQLiteDatabase.beginTransaction
是阻塞调用。
我在我的 Android 项目中使用 greendao 作为 ORM 库,但在理解事务行为时遇到问题。
greendao 提供了一个 API runInTx(Runnable r)
。
我的问题是,将如何处理来自不同线程的此方法的两次调用?
线程 1
public void thread1() {
DaoManager.INSTANCE.getDaoSession().runInTx(new Runnable()
{
doQueries();
doInsertsAndUpdates();
}
}
线程 2
public void thread2() {
DaoManager.INSTANCE.getDaoSession().runInTx(new Runnable()
{
doQueries();
doInsertsAndUpdates();
}
}
我看到,runInTx
正在以独占模式调用 SQLiteDatabase.beginTransaction
,因此当此事务打开时,没有其他线程可以 read/write 访问数据库。
但我无法弄清楚的是,当线程 1 正在做他的工作(即 doQueries
)时,另一个线程(即线程 2)是否会被阻塞,所以 doQueries
和 doInsertsAndUpdates
在线程 1 完成事务之前,线程 2 不会执行?
感谢您的帮助。
SQLiteDatabase.beginTransaction
是阻塞调用。