本文介绍了SQLite的多进程访问的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们使用的是在多进程和多线程应用程序的SQLite。
中的SQLite数据库文件使用的是嵌入式SQLite的加密方法加密。
中的指出的SQLite应该能够管理多进程访问使用锁机制。
我们正在经历一个奇怪的问题:
当许多线程访问同一个数据库文件,发生违法行为,更具体的某个约束 - 一个领域具有独特的约束称之为插入或更换之后越来越重复的值声明。
现在经常发生的,我们正在使用的加密技术。在我们开始使用SQLite加密,我们没有注意到这样的行为。
是否有任何特定的已知问题吗?


解决方案

虽然SQLite是线程安全的,你仍然可以' ŧ同时修改数据库:



Only one thread is allowed to modify the database at a time, but you can have multiple threads that attempt to modify the database.

If you want to avoid the failing-while-locked issue you can check the SQLITE_BUSY flag:

  while (continueTrying) {
    retval = sqlite_exec(db, sqlQuery, callback, 0, &msg);
    switch (retval) {
      case SQLITE_BUSY:
        Log("[%s] SQLITE_BUSY: sleeping fow a while...", threadName);
        sleep a bit... (use something like sleep(), for example)
        break;
      case SQLITE_OK:
        continueTrying = NO; // We're done
        break;
      default:
        Log("[%s] Can't execute \"%s\": %s\n", threadName, sqlQuery, msg);
        continueTrying = NO;
        break;
    }
  }

  return retval;

same reference

My bet is that your constraint violation has nothing to do with multithreading, so could you please post the actual constraint violation that you're getting (or an example that complies with www.sscce.org).

这篇关于SQLite的多进程访问的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-23 22:13