【发布时间】:2017-02-05 19:28:37
【问题描述】:
假设我有两个线程需要在 SQLite 数据库(在 Android 中)上执行原子的 Read-Mofify-Write 操作。
为了保证原子性,我用数据库事务包装了逻辑:
try {
database.beginTransaction();
... read-modify-write logic here
database.setTransactionSuccessful();
}
finally {
database.endTransaction();
}
默认情况下,此事务是 EXCLUSIVE 的(至少在 Android 上是这样)。性能(吞吐量)不是一个因素(客户端 - 预期的交易不多)。
到目前为止一切都很好,但有一个问题困扰着我:虽然上面的try-finally 模式将确保在抛出异常的情况下数据库的一致性,但如果真的发生了异常并且我没有捕捉到它 - 我的应用程序会崩溃...
当涉及到我自己的代码时,我知道可以抛出哪些异常以及如何处理它们,但是我试图了解在这种情况下 SQLite 数据库本身可以抛出哪些异常(如果有的话),但我不能在任何地方都可以找到它。
所以,我对上述代码的问题是:
- 单线程执行此代码时会抛出哪些致命异常(致命 = 无法恢复;让应用程序崩溃)?
- 单线程执行这段代码会抛出哪些非致命异常,如何处理?
- 如果一个线程已经在事务中,而另一个线程尝试启动一个新事务,那么第二个线程会阻塞直到第一个线程完成,还是会抛出异常?
提前致谢
【问题讨论】:
标签: android sqlite android-sqlite