Android:在事务期间可以从SQLite数据库中抛出异常吗?

时间:2017-02-05 19:28:37

标签: android sqlite android-sqlite

假设我有两个线程需要在SQLite数据库上执行原子Read-Mofify-Write操作(在Android中)。

为了确保原子性,我用数据库事务包装逻辑:

try {
    database.beginTransaction();
    ... read-modify-write logic here
    database.setTransactionSuccessful();
}
finally {
    database.endTransaction();
}

此交易默认为独占(至少在Android上)。性能(吞吐量)不是一个因素(客户端 - 预期的交易数量不多)。

直到现在一切都很好,但有一个问题困扰我:虽然上面的try-finally模式将确保数据库在抛出异常的情况下的一致性,如果异常真的被抛出而且我没有抓住它 - 我的应用程序会崩溃...

当涉及到我自己的代码时,我知道可以抛出哪些异常以及如何处理它们,但我试图了解SQLite数据库本身可以抛出哪些异常(如果有的话),但我不能在任何地方都能找到它。

所以,我对上述代码的疑问是:

  1. 当单个线程执行此代码时,可以抛出哪些致命异常(致命=不可恢复;让应用程序崩溃)?
  2. 当单个线程执行此代码时可以抛出哪些非致命异常,我该如何处理它们?
  3. 如果一个线程已经在事务中而另一个线程尝试启动一个新事务,那么第二个线程是否会阻塞直到第一个线程完成,或者是否会抛出异常?
  4. 提前致谢

1 个答案:

答案 0 :(得分:2)

在数据库操作期间,可能会发生各种类型的约束违规,但这些通常表示编程错误。 此外,读取或写入数据库文件可能会遇到任何随机硬件错误,这可能导致任何随机异常。

最后,如果数据库被锁定的时间太长,你会得到一个"数据库被锁定"例外。您可以使用PRAGMA busy_timeout调整特定连接的等待时间(默认值无用)。