Я знаю, что это действительно старый вопрос, но я сам столкнулся с этим вопросом и нашел решение для тех, кто может столкнуться с этим. Я надеюсь, что это кому-то поможет, потому что я знаю, что все, что я мог найти по этой теме, было ложной информацией, такой как информация, предоставленная Конрадом. Фактически вы можете иметь несколько открытых соединений с базой данных. На самом деле, в моем приложении у меня есть асинхронное соединение, используемое для записи данных в базу данных (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();
}
}
}
}