假设我有两个线程需要在SQLite数据库上执行原子Read-Mofify-Write操作(在Android中)。
为了确保原子性,我用数据库事务包装逻辑:
try {
database.beginTransaction();
... read-modify-write logic here
database.setTransactionSuccessful();
}
finally {
database.endTransaction();
}
此交易默认为独占(至少在Android上)。性能(吞吐量)不是一个因素(客户端 - 预期的交易数量不多)。
直到现在一切都很好,但有一个问题困扰我:虽然上面的try-finally
模式将确保数据库在抛出异常的情况下的一致性,如果异常真的被抛出而且我没有抓住它 - 我的应用程序会崩溃...
当涉及到我自己的代码时,我知道可以抛出哪些异常以及如何处理它们,但我试图了解SQLite数据库本身可以抛出哪些异常(如果有的话),但我不能在任何地方都能找到它。
所以,我对上述代码的疑问是:
提前致谢
答案 0 :(得分:2)
在数据库操作期间,可能会发生各种类型的约束违规,但这些通常表示编程错误。 此外,读取或写入数据库文件可能会遇到任何随机硬件错误,这可能导致任何随机异常。
最后,如果数据库被锁定的时间太长,你会得到一个"数据库被锁定"例外。您可以使用PRAGMA busy_timeout调整特定连接的等待时间(默认值无用)。