If you're sure that there's no other threads or processes accessing the database then I'd suggest you to look for help somewhere among Windows gurus because it sounds like an issue with file system which somehow tries to execute some tasks in background returning to the caller immediately. Maybe it's some antivirus that causes this...
Probably I saw somewhat similar problems not in SQLite but in general file manager: when I delete some directory recursively manager deletes first all files inside it and then deletes the directory itself. But sometimes it reports an error that directory cannot be deleted because it's not empty. Retrying in a second or so deletes directory successfully suggesting that file system (or our corporate antivirus maybe) has some bad races in this field... Pavel On Tue, Feb 23, 2010 at 1:20 PM, Alan Thomas <alan.tho...@attglobal.net> wrote: > The application runs as a singleton; there are no other applications > accessing the data base. > > I do not run the command-line tool while testing. > > I've cut down the example code: > > SqlStatus = sqlite3_open16 ( db_loc_string > , &SqlDB > ) ; > if ( SQLITE_OK != SqlStatus ) > { > . . . > return DATASTORE_UNAVAILABLE ; > } > > SqlStatus = sqlite3_prepare16_v2 ( SqlDB > , L"BEGIN TRANSACTION" > , 36 > , &SqlStmt > , NULL > ) ; > if ( SQLITE_OK != SqlStatus ) > { > . . . > return SQL_PREP_ERROR ; > } > > SqlStatus = sqlite3_step ( SqlStmt ) ; > if ( SQLITE_DONE != SqlStatus ) > { > . . . > return TXN_BEGIN_FAILED ; > } > > SqlStatus = sqlite3_finalize ( SqlStmt ) ; SqlStmt = NULL ; > if ( SQLITE_OK != SqlStatus ) > { > . . . > return SQL_FNLZ_ERROR ; > } > > swprintf_s ( (PXID_CHAR)sql_statement > , sizeof ( sql_statement ) / sizeof ( XID_CHAR ) > , L"DELETE" > L" FROM RSPNS" > L" WHERE . . . > ) ; > SqlStatus = sqlite3_prepare16_v2 ( SqlDB > , sql_statement > , ( lstrlen ( sql_statement ) + 1 ) * > sizeof ( XID_CHAR ) > , &SqlStmt > , NULL > ) ; > if ( SQLITE_OK != SqlStatus ) > { > . . . > return SQL_PREP_ERROR ; > } > > SqlStatus = sqlite3_step ( SqlStmt ) ; > if ( SQLITE_DONE != SqlStatus ) > { > . . . > return SQL_DLET_ERROR ; > } > > SqlStatus = sqlite3_finalize ( SqlStmt ) ; SqlStmt = NULL ; > if ( SQLITE_OK != SqlStatus ) > { > . . . > return SQL_FNLZ_ERROR ; > } > > SqlStatus = sqlite3_prepare16_v2 ( SqlDB > , L"COMMIT TRANSACTION" > , 38 > , &SqlStmt > , NULL > ) ; > if ( SQLITE_OK != SqlStatus ) > { > . . . > return SQL_PREP_ERROR ; > } > > SqlStatus = sqlite3_step ( SqlStmt ) ; > if ( SQLITE_DONE != SqlStatus ) > { > . . . > return TXN_COMMIT_FAILED ; > } > > SqlStatus = sqlite3_finalize ( SqlStmt ) ; SqlStmt = NULL ; > if ( SQLITE_OK != SqlStatus ) > { > . . . > return SQL_FNLZ_ERROR ; > } > > SqlStatus = sqlite3_prepare16_v2 ( SqlDB > , L"BEGIN TRANSACTION" > , 36 > , &SqlStmt > , NULL > ) ; > if ( SQLITE_OK != SqlStatus ) > { > . . . > return SQL_PREP_ERROR ; > } > > /*-------------------------*/ > > SqlStatus = sqlite3_step ( SqlStmt ) ; > if ( SQLITE_DONE != SqlStatus ) > { > . . . > return TXN_BEGIN_FAILED ; > } > > SqlStatus = sqlite3_finalize ( SqlStmt ) ; SqlStmt = NULL ; > if ( SQLITE_OK != SqlStatus ) > { > . . . > return SQL_FNLZ_ERROR ; > } > > . . . > > swprintf_s ( (PXID_CHAR)sql_statement > , sizeof ( sql_statement ) / sizeof ( XID_CHAR ) > , L"INSERT" > L" INTO RSPNS" > L" ( SERVER_NAME" > . . . > L" , RESPONSE_TEXT" > L" )" > L" VALUES ( '%s'" > . , , > L" , '%s'" > L" )" > , ServerName > . . . > , &InputBuffer[m] > ) ; > > SqlStatus = sqlite3_prepare16_v2 ( SqlDB > , (const char *)sql_statement > , ( lstrlen ( sql_statement ) + 1 ) * > sizeof ( XID_CHAR ) > , &SqlStmt > , NULL > ) ; > if ( SQLITE_OK != SqlStatus ) > { > SQLiteError ( sql_statement > , L"sqlite3_prepare16_v2 ( )" > ) ; > sqlite3_close ( SqlDB ) ; SqlDB = NULL ; > return SQL_PREP_ERROR ; > } > > SqlStatus = sqlite3_step ( SqlStmt ) ; > if ( SQLITE_DONE != SqlStatus ) > { > . . . > return SQL_ISRT_ERROR ; > } > > SqlStatus = sqlite3_finalize ( SqlStmt ) ; > if ( SQLITE_OK != SqlStatus ) > { > . . . > return XID_DBPA_SQL_FNLZ_ERROR ; > } > > . . . > > SqlStatus = sqlite3_prepare16_v2 ( SqlDB > , L"COMMIT TRANSACTION" > , 38 > , &SqlStmt > , NULL > ) ; > if ( SQLITE_OK != SqlStatus ) > { > . . . > return XID_DBPA_SQL_PREP_ERROR ; > } > > SqlStatus = sqlite3_step ( SqlStmt ) ; > if ( SQLITE_DONE != SqlStatus ) > { > . . . > return XID_DBPA_TXN_COMMIT_FAILED ; > } > > SqlStatus = sqlite3_finalize ( SqlStmt ) ; SqlStmt = NULL ; > if ( SQLITE_OK != SqlStatus ) > { > . . . > return XID_DBPA_SQL_FNLZ_ERROR ; > } > > sqlite3_close ( SqlDB ) ; SqlDB = NULL ; > > The SQLITE_BUSY condition is raised on approximately the 300th execution of > the second COMMIT TRANSACTION. > > > _______________________________________________ > sqlite-users mailing list > sqlite-users@sqlite.org > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users > _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users