开发者

Error #3119: Database file is currently locked

开发者 https://www.devze.com 2022-12-08 20:52 出处:网络
I have developed to applications in开发者_如何学Go flex. The one application constantly retrieves data from the internet, while the other can be opened and closed when you want, both apps use the same

I have developed to applications in开发者_如何学Go flex. The one application constantly retrieves data from the internet, while the other can be opened and closed when you want, both apps use the same database. The problem is that at random I get an Error #3119: Database file is currently locked. Is it not possible to have two stable connections in a Adobe AIR environment? Anyone has any solutions?


I think not. Not at once.


I know this is a really old question, but I ran into this issue myself and found a solution for it for those who may come across this. I hope this helps someone, because I know for me, all I could find on this topic was false information, like that given by Konrad. You can, in fact have multiple open database connections. Actually, in my application, I have an asynchronous connection used for writing data to the database (INSERT, UPDATE, DELETE), and a synchronous, read-only connection for reading from the database. On the asynchronous connection, for every execute, I always get an immediate lock by putting all statements in a transaction using

conn.begin(SQLTransactionLockType.IMMEDIATE);

This will allow you to read from the database while writing to it with another connection. Where I ran into a problem is when trying to read from the database from one connection after committing this async statement and before it actually finished writing the data. So, even though the documentation for SQLTransactionLockType.IMMEDIATE states you can still do reads while it is locked, you actually cannot while another statement is actively in the process of writing data.

I got around this by writing my own execute for the synchronous connection. It simply tries to execute, and if it fails due to Error #3119, try again until you succeed. Between each function call, the data will continue to be written to the database and eventually will no longer be busy. Here is the code for that function:

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();
            }
        }
    }
}


Another gotcha to watch out for with this error (if you're an idiot like me anyway) is to check if you've got the SQLite db file open in a db browser, which can lock the database, and cause this error (and hours of googling and irritation).

0

精彩评论

暂无评论...
验证码 换一张
取 消