gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 19:22:43 25 4
gpt4 key购买 nike

假设我有两个线程需要对 SQLite 数据库(在 Android 中)执行原子读取-修改-写入操作。

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

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

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

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

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

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

  1. 单线程执行这段代码会抛出哪些致命异常(fatal = irrecoverable; 让应用崩溃)?
  2. 单线程执行这段代码会抛出哪些非致命异常,如何处理?
  3. 如果一个线程已经在事务中,而另一个线程试图启动一个新事务,第二个线程会阻塞直到第一个线程完成,还是会抛出异常?

提前致谢

最佳答案

在数据库操作过程中,可能会发生各种违反约束的情况,但这些通常表明存在编程错误。此外,读取或写入数据库文件可能会遇到任何随机硬件错误,这可能导致任何随机异常。

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

关于Android:在事务期间可以从 SQLite 数据库中抛出异常吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42056262/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com