Ошибка № 3119: файл базы данных в настоящее время заблокирован - PullRequest
1 голос
/ 12 октября 2009

Я разработал для приложений в Flex. Одно приложение постоянно извлекает данные из Интернета, в то время как другое можно открывать и закрывать по желанию, оба приложения используют одну и ту же базу данных. Проблема в том, что наугад я получаю Error #3119: Database file is currently locked. Разве невозможно иметь два стабильных соединения в среде Adobe AIR? У кого-нибудь есть какие-то решения?

Ответы [ 3 ]

2 голосов
/ 05 февраля 2014

Я знаю, что это действительно старый вопрос, но я сам столкнулся с этим вопросом и нашел решение для тех, кто может столкнуться с этим. Я надеюсь, что это кому-то поможет, потому что я знаю, что все, что я мог найти по этой теме, было ложной информацией, такой как информация, предоставленная Конрадом. Фактически вы можете иметь несколько открытых соединений с базой данных. На самом деле, в моем приложении у меня есть асинхронное соединение, используемое для записи данных в базу данных (INSERT, UPDATE, DELETE), и синхронное соединение только для чтения для чтения из базы данных. В асинхронном соединении для каждого выполнения я всегда получаю немедленную блокировку, помещая все операторы в транзакцию, используя

conn.begin(SQLTransactionLockType.IMMEDIATE);

Это позволит вам читать из базы данных при записи в нее с другим подключением. Я столкнулся с проблемой при попытке чтения из базы данных из одного соединения после фиксации этого асинхронного оператора и до того, как он фактически завершил запись данных. Таким образом, хотя в документации для SQLTransactionLockType.IMMEDIATE говорится, что вы все еще можете выполнять чтение, пока оно заблокировано, вы на самом деле не можете этого сделать, пока другой оператор активно находится в процессе записи данных.

Я справился с этим, написав собственное выполнение для синхронного соединения. Он просто пытается выполнить, и если это не удается из-за ошибки # 3119, попробуйте снова, пока вы не преуспеете. Между каждым вызовом функции данные будут по-прежнему записываться в базу данных и в конечном итоге перестанут быть занятыми. Вот код для этой функции:

public static function execute(stmt:SQLStatement):void {
    try {
        stmt.execute();
    } catch (e:SQLError) {
        if(e.errorID == 3119) {
            execute(stmt);
        } else {
            trace(e.details + "\n" + e.getStackTrace());
            if(stmt.sqlConnection != null && stmt.sqlConnection.inTransaction) {
                stmt.sqlConnection.rollback();
            }
        }
    }
}
2 голосов
/ 12 октября 2009

Я думаю, что нет. Не сразу.

0 голосов
/ 17 августа 2016

Еще один момент, за которым стоит следить с этой ошибкой (если вы все равно такой же идиот, как я), это проверить, есть ли у вас файл базы данных SQLite, открытый в браузере БД , который может заблокировать базу данных и вызвать эту ошибку (а также часы гугления и раздражения).

...